[C#]TextBoxで、マウスクリック(1回目)だけ、内容を全選択させる

投稿日:2018-06-13

  • TextBoxの内容を全選択させるには、SelectAll()を使用
  • マウスの1回目も含めるなら、BeginInvoke~を使用

VB.net版はこちら。

TextBoxの中身を全選択させたい

テキスト入力エリアなら何でもいいんですが、例えば、InternetExplorerのアドレスバーを選択してみてください。

URLが全選択されるじゃないですか。

TextBoxでは、マウスクリック時には全選択されない

次に、Yahooの検索欄に適当に文字を入力して・・・

検索欄をクリックしても、全選択にはなりません。

Tab移動なら全選択になる

そうです、Tab移動なら全選択になります。

例示する画面を作るのが面倒くさかったので、IEで説明しましたが、TextBoxもこんな挙動してくれます。

入力ミスが多発する

システム画面の話に勝手に戻しますが、Tab移動という概念を持っていないお客さんって割りと入るんですよね。

そういったお客さんは、誠実にマウスでテキストボックスをクリックして入力してくれます。

で、その時何が起こるかというと・・・

入力ミス(ヒューマンエラーではないw)が発生します。

例えばですが、既に「10」とか入力されている数値を「15」に修正したいときに、マウスで選択して、入力を始めると・・・「1015」とか「1510」とかになっちゃう・・・

その時に気づけばいいものの、入力する数値によっては、気づかず次の入力項目へ・・・なんてこともありまして。

解決

        protected override void OnEnter(System.EventArgs e)
        {
            //全選択
            this.SelectAll();
        }

今までは、OnEnterメソッドをオーバーライドして書いてたんです。

ただ、これだと、マウスクリック時に全選択になってくれない。

タブ移動のは、OnEnterでアクティブになったタイミングで全選択になるのに・・・

じゃあ、どうしましょう?

って、別プロジェクトのソースひっくり返してみたら、なんか動いてるやつがあったので、コピペw

        protected override void OnEnter(System.EventArgs e)
        {
            //全選択
            this.BeginInvoke(new MethodInvoker(() => this.SelectAll()));
        }

これで、マウスクリック時(1回目)でもTextBoxの中身が全選択される。

https://social.msdn.microsoft.com/Forums/ja-JP/9d7864ac-af62-4af0-8f47-7575a6beb25b/textbox125011245712540124591247321462244712617812289textbox208691243?forum=csharpgeneralja

MSのコミュニティでも質問されてたけど、クリックイベントで拾えとか言われてもなぁ・・・って感じだった。

後は、TextBoxとしては、それが正しい挙動です!って言われても、それを何とかしたいんだよ・・・。

そうやって、お客さんに説明して納得してもらえるなら、どんなに楽かw

クリックイベントで単純に処理させたら、何回クリックしようが、ずっと全選択のまま。

2回目以降のクリックを判定するか、全選択されてたら全選択しないとか、別の処理を書くのも面倒くさい。

最後のほうに回答されてたけど、こんな感じの処理は必要になるのかな・・・と。

私の場合、マウスクリック時の全選択の挙動を突き詰めていくと、1回目は全選択する、2回目はクリックした位置へキャレットを移動したい、という仕様になりました。

芸はありませんが、フラグを使って1回目と2回目のマウスクリックを判別するのがポイントです。

TextBoxの派生クラスで、次の様にメンバ変数とメソッドをオーバーライドします。

private bool firstMouseDown = false;
 
protected override void OnEnter(EventArgs e)
{
    SelectAll();
    base.OnEnter(e);
}
 
protected override void OnMouseDown(MouseEventArgs e)
{
    if (firstMouseDown)
    {
        SelectAll();
        firstMouseDown = false;
    }
    base.OnMouseDown(e);
}
 
protected override void OnMouseEnter(EventArgs e)
{
    if (!this.Focused)
        firstMouseDown = true;
    else
        firstMouseDown = false;
 
    base.OnMouseEnter(e);
}
 
protected override void OnMouseLeave(EventArgs e)
{
    firstMouseDown = false;
    base.OnMouseLeave(e);
}

 

 

これで希望の動作が実現できていると良いのですが。
2007年6月27日 1:01
返信
|
引用

まぁ、正直動作の中身については良く分かってないまま使ってるけど、

        protected override void OnEnter(System.EventArgs e)
        {
            //全選択
            this.BeginInvoke(new MethodInvoker(() => this.SelectAll()));
        }

これで、マウスクリック時(1回目)に全選択にできる。

もちろん、修正だけして放置はしてませんよ?

動作確認して、お客さんの要望を満たせるのが分かったので、採用したんですw
(根拠が薄いw)

 

VB.net版はこちら。







-C#


関連記事

[C#]DateTimePickerは、CloseUpイベントで日付変更を取得する

日付関連で、取得した値がどうか?ってのを検出して判定する必要が出たのでメモ。 CloseUpイベントで何が判定されるのか? https://msdn.microsoft.com/ja-jp/libra …

ORACLEでTO_CHARを使用し、カンマ区切りデータを出力する

帳票出力を行うPGで困った。 数値形式のデータのため、カンマ区切りで表示したいんだけど、テンプレートの制約のせいで上手く行かなくて時の解決方法。 帳票のテンプレートとなるファイルのセルは文字列形式。 …

c#:高DPI環境化で、画面レイアウトが崩れる問題

自分の環境は高DPI(125%以上)ではないので、意識していなかったけど、客先環境でハマッたので。 状況は、Multirowを使った表部分が、高DPI環境下(125%)だと、レイアウトが崩れる問題。 …

VisualStudioでデータテーブルの中身確認できるの便利すぎワロタw

DataSetビジュアライザーで、DataTableの中身が確認できるのが便利すぎたのでメモ。 データテーブルって気軽に使えるけど、中身の確認がしち面倒くさい件 本当のところはどうなのか?ってのは知ら …

続) 何度だって引っかかるORACLEのエラー・・・。ORA-01008:バインドされていない変数があります。

この土日は休日出勤でした・・・ そして、昨日・・・新しい現象が発生しました。 日本の中心付近で仕様変更と闘うSE日記日本の中心付近で仕様変更と闘うSE日記http://ht-jp.net/blog/p …


カテゴリー