1. ホーム
  2. .net

[解決済み] WinFormsのテキストボックスでブラウザのアドレスバーのように動作させる

2022-04-25 04:28:53

質問

C# WinFormsのテキストボックスがフォーカスを受けたとき、ブラウザのアドレスバーのように動作させたいと思っています。

どういうことかというと、Webブラウザーのアドレスバーをクリックしてみてください。次のような動作に気づくでしょう。

  1. テキストボックスをクリックすると、それまでテキストボックスにフォーカスが当たっていなかった場合、すべてのテキストが選択されるはずです。
  2. テキストボックス内でマウスを押しながらドラッグすると、マウスでハイライトしたテキストだけが選択されます。
  3. テキストボックスがすでにフォーカスされている場合、クリックしてもすべてのテキストが選択されません。
  4. プログラムまたはキーボードによるタブ操作でテキストボックスをフォーカスすると、すべてのテキストが選択されるはずです。

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();
    }
}

私の知る限り、これによってテキストボックスはウェブブラウザのアドレスバーと全く同じように動作するようになります。

この単純な問題を解決しようとする次の人の助けになればいいのですが。

また、正しい道へ導いてくれるような回答をありがとうございました。