[解決済み] WinFormsのテキストボックスでブラウザのアドレスバーのように動作させる
質問
C# WinFormsのテキストボックスがフォーカスを受けたとき、ブラウザのアドレスバーのように動作させたいと思っています。
どういうことかというと、Webブラウザーのアドレスバーをクリックしてみてください。次のような動作に気づくでしょう。
- テキストボックスをクリックすると、それまでテキストボックスにフォーカスが当たっていなかった場合、すべてのテキストが選択されるはずです。
- テキストボックス内でマウスを押しながらドラッグすると、マウスでハイライトしたテキストだけが選択されます。
- テキストボックスがすでにフォーカスされている場合、クリックしてもすべてのテキストが選択されません。
- プログラムまたはキーボードによるタブ操作でテキストボックスをフォーカスすると、すべてのテキストが選択されるはずです。
WinFormsでまさにこれをやりたいのです。
FASTEST GUN ALERT: 回答する前に以下をお読みください。 ありがとう、みんな :-)
.SelectAll()を呼び出すのは .Enterまたは.GotFocusイベントを使用することはできません。 働く なぜなら、ユーザーが テキストボックスの場合、キャレットは をクリックすると、すべての選択が解除されます。 のテキストが表示されます。
.Clickイベント中に.SelectAll()を呼び出しても動作しない なぜなら、ユーザーはマウスでテキストを選択することができないからです。.SelectAll() を呼び出すと、ユーザーのテキスト選択が上書きされ続けることになります。
フォーカス/エンターイベントで BeginInvoke((Action)textbox.SelectAll) を呼び出すとうまくいかない というのも、上記のルール2が破られるため、フォーカスされたユーザーの選択を上書きし続けるからです。
解決方法は?
まず最初に、回答ありがとうございました 合計9件の回答がありました。ありがとうございました。
悪い知らせ:すべての回答が、何らかのクセがあったり、まったく(あるいはまったく)機能しなかったりしたのです。それぞれの投稿にコメントを追加しておきました。
良い知らせ:うまくいく方法を見つけました。この解決策はとても簡単で、すべてのシナリオ(マウスダウン、テキスト選択、タブフォーカスなど)で動作するようです。
bool alreadyFocused;
...
textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;
...
void textBox1_Leave(object sender, EventArgs e)
{
alreadyFocused = false;
}
void textBox1_GotFocus(object sender, EventArgs e)
{
// Select all text only if the mouse isn't down.
// This makes tabbing to the textbox give focus.
if (MouseButtons == MouseButtons.None)
{
this.textBox1.SelectAll();
alreadyFocused = true;
}
}
void textBox1_MouseUp(object sender, MouseEventArgs e)
{
// Web browsers like Google Chrome select the text on mouse up.
// They only do it if the textbox isn't already focused,
// and if the user hasn't selected all text.
if (!alreadyFocused && this.textBox1.SelectionLength == 0)
{
alreadyFocused = true;
this.textBox1.SelectAll();
}
}
私の知る限り、これによってテキストボックスはウェブブラウザのアドレスバーと全く同じように動作するようになります。
この単純な問題を解決しようとする次の人の助けになればいいのですが。
また、正しい道へ導いてくれるような回答をありがとうございました。
関連
-
[解決済み】この動詞型ではcontent-bodyを送信できない
-
[解決済み] アセンブリから型を読み込めなかったエラー
-
[解決済み] app.configのマッピングがないアセンブリのapp.configの再マッピングを考慮する。
-
[解決済み] BasicHttpsBindingとWsHttpBinding with Transport securityの違いは何ですか?
-
[解決済み] SQL Server Compact EditionデータベースのLINQ to SQLで、"Row not found or changed "例外を解決するにはどうすればよいですか?
-
[解決済み] AndroidでWCFサービスを利用する方法
-
[解決済み] .NET Framework 4 マルチターゲティングパックがアンインストールできない
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?
-
[解決済み] WPFのStaticResourceとDynamicResourceの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] app.configのマッピングがないアセンブリのapp.configの再マッピングを考慮する。
-
[解決済み] WPFで角丸ボタンを作成する/作るには?
-
[解決済み] Microsoft.NETFrameworkとMicrosoft.NETFramework64の違いは何ですか?
-
[解決済み] データテーブルがすでに別のデータセットに属している
-
[解決済み] DockPanelを空きスペースいっぱいに表示させる方法
-
[解決済み] ファイルまたはアセンブリをロードできませんでした 操作がサポートされていません。(HRESULT: 0x80131515 からの例外)
-
[解決済み] 1は有効なWin32アプリケーションではありません "を解決するには?
-
[解決済み] 実際のサービスはデータを返すのに、なぜWebServiceはnullを返すのですか?
-
[解決済み] WCFのデバッグ時にサーバーに自動的に踏み込むことができない
-
[解決済み] .NETでのdecimal, float, doubleの違い?