【.NET】クリックしたときに全選択されるテキストボックスを作成するシンプルな方法

f:id:ktts:20190601225751p:plain

ブラウザーのアドレスバーみたいなTextBoxを作成する必要があったので調べてみましたが、
シンプルな方法が欲しかったので記事にします。

参考サイト
stackoverflow.com

対象のテキストボックスに下記のEnterイベントを設定します。

C#の場合

/// <summary>
/// アクティブになったときにテキストを全選択します。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyTextBox_Enter(object sender, EventArgs e)
{
    BeginInvoke(new Action(myTextBox.SelectAll));
}

VB.NETの場合

''' <summary>
''' アクティブになったときにテキストを全選択します。
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles myTextBox.Enter
    BeginInvoke(New Action(AddressOf myTextBox.SelectAll))
End Sub

しくみ
普通にEnterイベントでSelectAllしても、選択後にクリックが発生して選択状態が解除されます。
そこでBeginInvokeを利用することでSelectAllが非同期実行されて、期待した動作が実現されました。

※今回は引数なし戻り値なしメソッドのdelegateを取得するためにAction(void() target)デリゲートを利用していますが、
引数があったり戻り値があったりするメソッドの場合は記法が変わってくるので、
”how to convert method to delegate”等でググってみてください。