WinForms TextBoxをブラウザのアドレスバーのように動作させる


154

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

意味を確認するには、Webブラウザーのアドレスバーをクリックしてください。次の動作がわかります。

  1. テキストボックスが以前にフォーカスされていなかった場合、テキストボックスをクリックすると、すべてのテキストが選択されます。
  2. マウスを下に移動してテキストボックスにドラッグすると、マウスで強調表示したテキストのみが選択されます。
  3. テキストボックスがすでにフォーカスされている場合、クリックしてもすべてのテキストが選択されるわけではありません。
  4. プログラムで、またはキーボードのタブでテキストボックスにフォーカスすると、すべてのテキストが選択されます。

これをWinFormsで正確に実行したいと考えています。

最速の銃警報:回答する前に以下をお読みください!みんなありがとう。:-)

.Enterまたは.GotFocusイベント中に.SelectAll()を呼び出しても機能しません。ユーザーがテキストボックスをクリックすると、クリックした場所にキャレットが配置され、すべてのテキストの選択が解除されるためです。

.Clickイベント中に.SelectAll()を呼び出しても機能しません。これは、ユーザーがマウスでテキストを選択できないためです。.SelectAll()呼び出しは、ユーザーのテキスト選択を上書きし続けます。

focus / enterイベントのenterでBeginInvoke((Action)textbox.SelectAll)を呼び出すと、上記のルール#2に違反するため機能しません。フォーカスに対するユーザーの選択をオーバーライドし続けます。


3
これが「RichTextBox」用であることを明確にしてください。
Nescio 2008

Nescio、テキストボックス、またはリッチテキストボックスで十分です。私もあなたの解決策をテキストボックスで試しました。
ユダガブリエルヒマンゴ

これは抽象リークです。WM_MOUSEACTIVATE-ingでない場合は、WM_MOUSEACTIVATEおよびWM_SETFOCUS上のSelectAllにフラグを付けるためにそれを行うための最良の方法。
wqw

回答:


109

まず、答えてくれてありがとう!合計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();
    }
}

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

うまくいけば、これがこの一見単純な問題を解決しようとする次の人を助けるでしょう。

皆さん、ありがとうございました。あなたのすべての回答が私を正しい道に導いてくれました。


プログラムによってフォーカスがTextBoxに設定されるとどうなりますか?ここで説明したように、私はその問題を抱えています:stackoverflow.com/questions/24790704/…流行の後でそれを解決することができましたが、私の「修正」はかなり不器用に見えるので、私はまだそれについて緊張しています。
B.クレイシャノン

「.Enterまたは.GotFocusイベント中の.SelectAll()の呼び出しは機能しません。ユーザーがテキストボックスをクリックした場合、キャレットがクリックされた場所に配置され、すべてのテキストの選択が解除されるためです。」GotFocusイベントにSelectAllがありますが、これはほとんどの場合機能します。実際、ユーザーがクリックした場所にカーソルを置くのは「良いこと」だと思います。プログラムでTextBoxにフォーカスが設定されている場合は、常に選択されるようにしたいだけです。
B.クレイシャノン

そして、私は再びここにいます!:)
dotNET

3
alreadyFocused = true;in MouseUpをifステートメントの外に移動する必要があります。テキストの一部をすぐに選択すると、次のクリックでテキスト全体が再び選択されるためです。
ロバートS.

以下にワンライナーの回答があります--- BeginInvoke((Action)MyTextBox.SelectAll); ---見る価値があります。必要なすべてを実行しているようです
グレイ将軍

78

私はこれに対するより簡単な解決策を見つけました。これにはControl.BeginInvoke、EnterおよびClickイベントが発生した後に発生するように、SelectAllを非同期で開始することが含まれます。

C#の場合:

private void MyTextBox_Enter(object sender, EventArgs e)
{
    // Kick off SelectAll asyncronously so that it occurs after Click
    BeginInvoke((Action)delegate
    {
        MyTextBox.SelectAll();
    });
}

VB.NETで(Krishanu Deyに感謝)

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub

5
私が今まで見つけた最もスマートな答え.. Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
どうも

Class Much 'WebブラウザーのURLバーなどの最高のソリューション、多くのクラスEnd Class
ar.dll

7
.Net 4.0では、次のことができます。BeginInvoke((Action)MyTextBox.SelectAll);
JoelFan 2014年

2
残念ながら、BeginInvokeは私には機能しません(私の壊滅的にほこりっぽいバージョンのDotネットのため、疑いもなく)。先頭に「コントロール」。これは役に立ちませんし、TextBox自体の名前の先頭に追加することもできません。一人で、淡々とうろついている...
B.クレイシャノン

2
このソリューションは、質問で説明されているとおりに動作しないことに注意してください。具体的にMouse down and drag in the textbox should select only the text I've highlighted with the mouse.は、希望どおりに機能しません。しかし、それでもなお最も短くて最もエレガントな解決策:)
Marcus Mangelsdorf

30

あなたの解決策は良いですが、特定のケースで失敗します。単にクリックするのではなく、テキストの範囲を選択してTextBoxにフォーカスを与えると、alreadyFocussedフラグはtrueに設定されないため、もう一度TextBoxをクリックすると、すべてのテキストが選択されます。

これが私のソリューションのバージョンです。また、TextBoxを継承するクラスにコードを追加したので、ロジックがうまく隠されています。

public class MyTextBox : System.Windows.Forms.TextBox
{
    private bool _focused;

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }
}

2
カスタムテキストボックスの提案と完全に機能するソリューションの+1!
2010年

素晴らしいソリューション。コードを直接私のソリューションにコピーし、名前空間を変更して無実を保護し、完全に機能しました。ありがとう!
kenswdev 2014年

8

少々面倒ですが、クリックイベントではを使用してくださいSendKeys.Send( "{HOME}+{END}" );


ウフタ!それはちょっとしたハッカーです!:-)提案をありがとう。より良いアイデアはありますか?
ユダガブリエルヒマンゴ2008

確かにハッキングですが、これはまったく悪いことには聞こえません
Terry

3
多くのウイルス対策プログラムがSEND KEYSを悪意のあるものとしてインターセプトおよびブロックすることを考慮してください。それは素晴らしい解決策ではありません。
ユダガブリエルヒマンゴ

4

テキストボックスのイベントをクリックしますか?あるいは、MouseCaptureChangedイベントでも機能します。- OK。動作しません。

したがって、2つのことを行う必要があります。

private bool f = false;

private void textBox_MouseClick(object sender, MouseEventArgs e)
{ 
  if (this.f) { this.textBox.SelectAll(); }
  this.f = false;
}

private void textBox_Enter(object sender, EventArgs e)
{
  this.f = true;
  this.textBox.SelectAll();
}
private void textBox_MouseMove(object sender, MouseEventArgs e) // idea from the other answer
{
  this.f = false; 
}

(textBoxesからoneへの)タブ移動にも機能します-念のためEnterでSelectAll()を呼び出します...


Ok Jakub、それは部分的に機能します。テキストボックスにタブで移動する場合は、フォーカスする必要があります。それはあなたのソリューションで機能しますか?(方法を教えていただければ、正解としてマークします。)
ジュダガブリエルヒマンゴ

Jakub、あなたがコードを投稿したので、それは時々動作するようです。常にではない; 現在、テキストボックスをクリックしていますが、すべてが選択されているわけではありません。
ユダガブリエルヒマンゴ

テキストをクリックしても、すべてが選択されない場合があります。どういうわけか、.fフィールドが本来あるべき値に設定されておらず、SelectAllが呼び出されないようなものです。見たことない?
ユダガブリエルヒマンゴ

mouseMouveのおかげで、マウスを動かしながらゆっくりクリックできることを知っています(特にワイド文字の場合)->フラグの設定を解除します。あなたはmouseMoveイベントでコードを削除することができますが、あなたが得るよりも-tabbginの後で制御してから-reSelectAll-最初のドラッグで攪拌の一部を選択できません
Jakub Kotrla

4

私が使用する一行の答え...あなたは自分を蹴っているかもしれません...

Enterイベント:

txtFilter.BeginInvoke(new MethodInvoker(txtFilter.SelectAll));


1
いいえ、機能しません。これはすべてのテキストを選択しますが、ユーザーがテキストの一部だけを選択することもできなくなります。
ユダガブリエルヒマンゴ2009

すみません、あなたが探していた行動を誤解したに違いありません。Enterキーを押すと、すべてが選択されます。クリックして押し続けると、最初からカーソルまで選択します。私が持っているものを使用して、SelectAllを独自の選択ロジックで置き換えることができると思います。 notifywire.com/demos/2009-04-14_1248.swf

よく働く!最初のクリックでボックスに入ります。次に、クリックしてドラッグし、テキストを選択します。
D_Bester 2014

注:Webブラウザーのアドレスバーのようには機能しません。Webブラウザーのアドレスバーを使用すると、テキストボックスにフォーカスがない場合でも、テキストボックス内でマウスダウンしてドラッグ/選択できます。このソリューションはそれを解決しません。それでよければ、クールですが、この質問の要件を満たしていません。
ユダガブリエルヒマンゴ2016

3
'Inside the Enter event
TextBox1.SelectAll();

OK、ここで試した後、あなたが望むものです:

  • Enterイベントで、Enterイベントに参加したことを示すフラグを開始します
  • Clickイベントで、フラグを設定した場合は、.SelectAll()を呼び出してフラグをリセットします。
  • MouseMoveイベントで、enteredフラグをfalseに設定します。これにより、最初にテキストボックスを入力しなくても、ハイライトをクリックできます。

これにより、入力時にすべてのテキストが選択されましたが、後でテキストの一部を強調表示したり、最初のクリックで強調表示したりできます。

リクエストにより:

    bool entered = false;
    private void textBox1_Enter(object sender, EventArgs e)
    {
        entered = true;
        textBox1.SelectAll();   //From Jakub's answer.
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        if (entered) textBox1.SelectAll();
        entered = false;
    }

    private void textBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (entered) entered = false;
    }

私にとって、コントロールへのタブ移動はすべてのテキストを選択します。


あなたの解決策はJakubの解決策に似ています。クリックすると機能します。テキストボックスにタブで移動すると機能しますか?(たとえば、ブラウザのアドレスバーにタブを移動すると、すべてのテキストも選択されます。)
Judah Gabriel Himango

はい、タブ移動にも使用できます。私はテストアプリを書きましたが、これは私がそれを機能させる方法でした。
MagicKat 2008

タブでは機能しないようです。タブで機能するコードを見せていただけますか?
ユダガブリエルヒマンゴ

3

これは、ソリューションを次のレベルに進めるヘルパー関数です-継承なしで再利用します。

    public static void WireSelectAllOnFocus( TextBox aTextBox )
    {
        bool lActive = false;
        aTextBox.GotFocus += new EventHandler( ( sender, e ) =>
        {
            if ( System.Windows.Forms.Control.MouseButtons == MouseButtons.None )
            {
                aTextBox.SelectAll();
                lActive = true;
            }
        } );

        aTextBox.Leave += new EventHandler( (sender, e ) => {
            lActive = false;
        } );

        aTextBox.MouseUp += new MouseEventHandler( (sender, e ) => {
            if ( !lActive )
            {
                lActive = true;
                if ( aTextBox.SelectionLength == 0 ) aTextBox.SelectAll();
            }   
        });
    }

これを使用するには、TextBoxを渡す関数を呼び出すだけで、すべての厄介なビットが処理されます。Form_Loadイベントですべてのテキストボックスを関連付けることをお勧めします。この関数をフォームに配置するか、私のような場合はユーティリティクラスのどこかに配置して、さらに再利用できます。


2

これは、WPF / XAML TextBoxで機能しました。

    private bool initialEntry = true;
    private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        if (initialEntry)
        {
            e.Handled = true;
            initialEntry = false;
            TextBox.SelectAll();
        }
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox.SelectAll();
        initialEntry = true;      
    }

2

これはnzhenryの一般的な回答に似ていますが、サブクラス化する必要がない方が簡単です。

Private LastFocused As Control = Nothing

Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
    If MouseButtons = Windows.Forms.MouseButtons.None Then LastFocused = sender
End Sub

Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave
    LastFocused = Nothing
End Sub

Private Sub TextBox1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp, TextBox2.MouseUp, TextBox3.MouseUp
    With CType(sender, TextBox)
        If LastFocused IsNot sender AndAlso .SelectionLength = 0 Then .SelectAll()
    End With
    LastFocused = sender
End Sub

1

SelectAllは私にとってはうまくいきませんでした。

これは機能します。

ActiveControl = textBox1;
textBox1->SelectionStart = 0;
textBox1->SelectionLength = textBox1->Text->Length;

これは、テキストボックスへのタブ移動がフォーカスをもたらす場合の説明にはなりません。また、このスレッドで説明されている他の問題もいくつか示しています。
ユダガブリエルヒマンゴ

1

私はさらに簡単な解決策を見つけました:

textBoxをクリックしたときにすべてのテキストが選択されていることを確認するには、ClickハンドラーがEnterハンドラーを呼び出していることを確認してください。追加の変数は必要ありません!

例:

private void textBox1_Click(object sender, EventArgs e){
        textBox1_Enter(sender, e);
    }

private void textBox1_Enter(object sender, EventArgs e){
        TextBox tb = ((TextBox)sender);
        tb.SelectAll();
    }

これは、コントロールへのタブによるフォーカスでは機能しません。また、すべてを選択せず​​にテキストを選択したい場合はどうでしょうか?
ユダガブリエルヒマンゴ2015

実際には、それをタブで操作しても機能します!MS Visual C#2010を使用してダミープロジェクトでテストしました。このソリューションの厄介な点は、すべてを選択しないと一部のテキストを選択できないことです。それだけを行いたい場合は、もちろんコードは必要ありません。マウスを使用して選択する(またはキーボードを使用する)ことができます。
Pieter Heemeryck、2015

そして、それがこのソリューションが提示された問題を解決しない理由です。すべてのテキストを選択しないとアドレスの個々の部分をクリックできないため、ブラウザのアドレスボックスのように動作しません。
ユダガブリエルヒマンゴ2015

わかりました。質問のタイトルとWebブラウザーのアドレスバーの例では、テキストの一部を選択できるはずではありませんでした。あなたはこれを質問の最後の文の片側としてのみ述べました。よろしく。
Pieter Heemeryck、2015

0
private bool _isSelected = false;
private void textBox_Validated(object sender, EventArgs e)
{
    _isSelected = false;
}

private void textBox_MouseClick(object sender, MouseEventArgs e)
{
    SelectAllText(textBox);
}

private void textBox_Enter(object sender, EventArgs e)
{
    SelectAllText(textBox);
}

private void SelectAllText(TextBox text)
{
    if (!_isSelected)
    {
        _isSelected = true;
        textBox.SelectAll();
    }
}

RichTextBoxでテストしました。動作しません。テキストボックスをクリックしても、すべてのテキストが選択されているようには見えません。(カーソルがカーソルに置かれていると、マウスダウンで選択が解除されるため)
ジュダガブリエルヒマンゴ

0

興味深いことに、DropDownStyle = SimpleのComboBoxは、まさにまさにあなたが探している振る舞いを持っていると思います。

(リストを表示しないようにコントロールの高さを減らし、さらに数ピクセル増やす場合、ComboBoxとTextBoxの間に実質的な違いはありません。)


興味深いですが、TextBoxとRichTextBoxで機能させるには、これが本当に必要です。
ユダガブリエルヒマンゴ2009年

0

テキストボックスのMouseDown-Eventを使用しないのはなぜですか。私には問題なく動作し、追加のブール値は必要ありません。非常にクリーンでシンプルな例:

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }

いいえ、これに関するいくつかの問題:テキストボックスに既にフォーカスがある場合は考慮されません(テキストボックスにフォーカスがないときだけ、すべてのマウスダウンを選択する必要はありません)。テキストの一部は、タブでテキストボックスにフォーカスを移動すると機能しません。
ユダガブリエルヒマンゴ

0

MouseUpイベント内でSelectAllを呼び出したところ、問題なく動作しました。

    private bool _tailTextBoxFirstClick = false;

    private void textBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if(_textBoxFirstClick)           
            textBox1.SelectAll();

        _textBoxFirstClick = false;
    }  

    private void textBox1_Leave(object sender, EventArgs e)
    {
        _textBoxFirstClick = true;
        textBox1.Select(0, 0);
    }

ええ、これがすべてのシナリオで機能しない理由については、他の回答(およびコメント)を参照してください。
ユダガブリエルヒマンゴ2009年

このソリューションのタブを確認しませんでした。私の悪い。ご指摘ありがとうございます。これで完全なソリューションが得られたことをうれしく思います。また、MouseUpに対する私の提案がソリューションに含まれていたことも嬉しく思います。
Sreejith K.

0

TextBoxまたはMaskedTextBoxからクラスを派生させるだけです。

public class SMaskedTextBox : MaskedTextBox
{
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        this.SelectAll();
    }
}

そして、あなたのフォームでそれを使用してください。


これは機能しません。理由を理解するには、他の回答とコメントを参照してください。
ユダガブリエルヒマンゴ


0

実際、GotFocusは、興味のある正しいイベント(メッセージ)です。これは、コントロールにどのように到達しても、最終的にはこれを取得するためです。問題は、いつSelectAll()を呼び出すかです。

これを試して:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.GotFocus += new EventHandler(textBox1_GotFocus);
    }

    private delegate void SelectAllDelegate();    
    private IAsyncResult _selectAllar = null; //So we can clean up afterwards.

    //Catch the input focus event
    void textBox1_GotFocus(object sender, EventArgs e)
    {
        //We could have gotten here many ways (including mouse click)
        //so there could be other messages queued up already that might change the selection.
        //Don't call SelectAll here, since it might get undone by things such as positioning the cursor.
        //Instead use BeginInvoke on the form to queue up a message
        //to select all the text after everything caused by the current event is processed.
        this._selectAllar = this.BeginInvoke(new SelectAllDelegate(this._SelectAll));
    }

    private void _SelectAll()
    {
        //Clean-up the BeginInvoke
        if (this._selectAllar != null)
        {
            this.EndInvoke(this._selectAllar);
        }
        //Now select everything.
        this.textBox1.SelectAll();
    }
}

アリ、これは機能しません。テキストの真ん中にマウスを置いてみてください。マウスボタンを1秒間押し続けます。
ユダガブリエルヒマンゴ

0

フォーム内のテキストボックスのグループ:

private System.Windows.Forms.TextBox lastFocus;   

private void textBox_GotFocus(object sender, System.Windows.Forms.MouseEventArgs e)   
{
    TextBox senderTextBox = sender as TextBox;
    if (lastFocus!=senderTextBox){
        senderTextBox.SelectAll();
    }
    lastFocus = senderTextBox;   
}

1
これは適切に機能しません。.SelectAll()を提案する他の回答に対する私の返信を参照してください。テキストを選択しようとしているときにテキストボックスに入ると、すべてのテキストを選択してテキストの選択を解除するため、機能しません。フォーカスがテキストボックスにマウスアップまたはタブで入力された場合にのみテキストを選択しますが、フォーカスがマウスダウンで発生した場合のみです。
ユダガブリエルヒマンゴ

0

これはすでに解決されていることはわかっていますが、実際はかなり単純だと思うのですが。

マウスアップイベントでは、配置するだけです

if(textBox.SelectionLength = 0)
{
    textBox.SelectAll();
}

VB.NETで動作するようです(これはC#の質問であることを知っています...悲しいことに私は自分の仕事でVBを使用せざるを得ませんでした。 )

私はまだそれに関する問題を発見していません..それはクリックですぐに選択されないという事実を除いて、私はそれで問題を抱えていました....


1
元のリクエストでは、フィールドにタブで移動したときにもこれが機能することを望みました。
Don Kirkby

2
はい、これはすべてのシナリオで機能するわけではありません。テキストボックスをクリックしたときにのみ機能します。それでも、テキストボックスに選択範囲が既に存在する場合、ブラウザのアドレスバーのように動作しません。
ユダガブリエルヒマンゴ2012年

0

次の解決策は私のために働きます。私が追加OnKeyDownOnKeyUpイベントの上書きは常に選択のTextBoxのテキストを維持します。

    public class NumericTextBox : TextBox
{
    private bool _focused;
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        if (MouseButtons == MouseButtons.None)
        {
            this.SelectAll();
            _focused = true;
        }
    }
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);

        if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
       base.OnKeyDown(e);
       if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
}

2
テキストボックスにマウスダウンし、カーソルをドラッグしてテキストを選択してから、マウスを上に移動できますか?
ユダガブリエルヒマンゴ2012

0

コントロールを離れるときに選択を設定します。戻ってきたらそこにある。フォームをタブで囲み、コントロールに戻ると、すべてのテキストが選択されます。

マウスで移動すると、キャレットはクリックした場所に正しく配置されます。

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.SelectAll();
    }

マウスで行った場合、既にフォーカスされていない限り、すべてのテキストが選択されます。これはサポートしていません。
ユダガブリエルヒマンゴ2013年

0

非常にシンプルなソリューション:

    private bool _focusing = false;

    protected override void OnEnter( EventArgs e )
    {
        _focusing = true;
        base.OnEnter( e );
    }

    protected override void OnMouseUp( MouseEventArgs mevent )
    {
        base.OnMouseUp( mevent );

        if( _focusing )
        {
            this.SelectAll();
            _focusing = false;
        }
    }

編集:元のOPは特にマウスダウン/テキスト選択/マウスアップシーケンスを懸念していました。その場合、上記の簡単な解決策はテキストが部分的に選択されることになります。

これで問題が解決するはずです(実際には、WM_SETCURSORをインターセプトします)。

    protected override void WndProc( ref Message m )
    {
        if( m.Msg == 32 ) //WM_SETCURSOR=0x20
        {
              this.SelectAll(); // or your custom logic here                
        }

        base.WndProc( ref m );
    }

*実際には、次のシーケンスでは部分的なテキスト選択が行われますが、テキストボックスの上にマウスを移動すると、すべてのテキストが再び選択されます。

マウスダウン/テキスト選択/マウス移動テキストボックス/マウスアップ


このソリューションはすでに投稿されています。それが機能しない理由を見つけるために、既存の回答へのコメントを参照してください。
ユダガブリエルヒマンゴ2014

タブとマウスで機能し、フォーカスを取得してテキストを選択してからマウスを上に移動できます。これで問題を見つけられないようです。指摘していただけますか?
マウロサンピエトロ2014

0

マウスをクリックしてすぐに離さないときに、この作業が最も効果的です。

    private bool SearchBoxInFocusAlready = false;
    private void SearchBox_LostFocus(object sender, RoutedEventArgs e)
    {
        SearchBoxInFocusAlready = false;
    }

    private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.ButtonState == MouseButtonState.Released && e.ChangedButton == MouseButton.Left &&
            SearchBox.SelectionLength == 0 && SearchBoxInFocusAlready == false)
        {
            SearchBox.SelectAll();
        }

        SearchBoxInFocusAlready = true;
    }

0

私のソリューションはかなり原始的ですが、私の目的のためにうまく機能します

private async void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    if (sender is TextBox)
    {
        await Task.Delay(100);
        (sender as TextBox).SelectAll();
    }
}

マウスを押してテキストの束を選択し、マウスをドラッグしてから上に移動したい場合は機能しません。コードによって選択がクリアされ、すべてが選択されます。
ユダガブリエルヒマンゴ2015

@JudahHimango Jup。シングルクリックすると、すべてが選択されます。クリックしてドラッグすると、選択のみが選択されます。少なくともFirefoxのブラウザバーはまさにこの動作を示しています。
BlueWizard 2015

しかし、それは競合状態ではありませんか?マウスでテキストをすばやく選択できた場合、.SelectAll()はミリ秒後に起動し、選択内容を上書きします。
ユダガブリエルヒマンゴ2015

1
さて、もしあなたが物事を素早く選択するなら、これはあなたに反するでしょう。
BlueWizard

-1

以下は動作するようです。Enterイベントはコントロールへのタブ移動を処理し、コントロールがクリックされるとMouseDownが機能します。

    private ########### void textBox1_Enter(object sender, EventArgs e)
    {
        textBox1.SelectAll();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (textBox1.Focused)
            textBox1.SelectAll();
    }

運が悪いので、うまくいきません。テキストを選択してみてください。.SelectAllテキストは、ユーザーが選択しようとしている内容を上書きします。
ユダガブリエルヒマンゴ2008

-1

答えは実際には上記のすべてよりもはるかに単純な場合があります。たとえば(WPFの場合):

public void YourTextBox_MouseEnter(object sender, MouseEventArgs e)
    {
        YourTextBox.Focus();
        YourTextBox.SelectAll();
    }

もちろん、このコードの使用方法はわかりませんが、ここで確認する主要な部分は次のとおりです。最初に.Focus()を呼び出し、次に.SelectAll();を呼び出します。


これは機能せず、他の回答と重複しています。たとえば、テキストボックスでマウスを下に移動してドラッグすると、テキストの一部が選択されます。これはそれを壊し、すべてを選択するわけではありません。
ユダガブリエルヒマンゴ2016

-1

enterイベントとclickイベントでselectall()を使用するだけです

private void textBox1_Enter(object sender, EventArgs e)
        {

            textBox1.SelectAll();
        }
        private void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.SelectAll();
        }

これは、テキストを選択するまで機能します。詳しい説明については、他の回答を参照してください。
ユダガブリエルヒマンゴ2015

-1

新しいVB.Net Wpfプロジェクトを作成しました。1つのTextBoxを作成し、コードビハインドに以下を使用しました。

Class MainWindow 

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler PreviewMouseLeftButtonDown, New MouseButtonEventHandler(AddressOf SelectivelyIgnoreMouseButton)
        AddHandler GotKeyboardFocus, New KeyboardFocusChangedEventHandler(AddressOf SelectAllText)
        AddHandler MouseDoubleClick, New MouseButtonEventHandler(AddressOf SelectAllText)
    End Sub

    Private Shared Sub SelectivelyIgnoreMouseButton(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
        ' Find the TextBox
        Dim parent As DependencyObject = TryCast(e.OriginalSource, UIElement)
        While parent IsNot Nothing AndAlso Not (TypeOf parent Is TextBox)
            parent = VisualTreeHelper.GetParent(parent)
        End While

        If parent IsNot Nothing Then
            Dim textBox As Object = DirectCast(parent, TextBox)
            If Not textBox.IsKeyboardFocusWithin Then
                ' If the text box is not yet focussed, give it the focus and
                ' stop further processing of this click event.
                textBox.Focus()
                e.Handled = True
            End If
        End If
    End Sub

    Private Shared Sub SelectAllText(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim textBox As Object = TryCast(e.OriginalSource, TextBox)
        If textBox IsNot Nothing Then
            textBox.SelectAll()
        End If
    End Sub

End Class
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.