Tạo một TextBox WinForms hoạt động giống như thanh địa chỉ của trình duyệt của bạn


154

Khi hộp văn bản C # WinForms nhận được tiêu điểm, tôi muốn nó hoạt động giống như thanh địa chỉ của trình duyệt của bạn.

Để xem ý tôi là gì, nhấp vào thanh địa chỉ trình duyệt web của bạn. Bạn sẽ nhận thấy hành vi sau:

  1. Nhấp vào hộp văn bản sẽ chọn tất cả văn bản nếu hộp văn bản không được tập trung trước đó.
  2. Chuột xuống và kéo trong hộp văn bản sẽ chỉ chọn văn bản tôi đã tô sáng bằng chuột.
  3. Nếu hộp văn bản đã được tập trung, nhấp vào không chọn tất cả văn bản.
  4. Tập trung vào hộp văn bản theo chương trình hoặc thông qua tab bàn phím nên chọn tất cả văn bản.

Tôi muốn làm chính xác điều này trong WinForms.

ALUN GUN NHANH NHẤT: vui lòng đọc phần sau đây trước khi trả lời! Cảm ơn các bạn. :-)

Gọi .Select ALL () trong các sự kiện. Entry hoặc .GotF Focus sẽ không hoạt động vì nếu người dùng nhấp vào hộp văn bản, dấu mũ sẽ được đặt ở nơi anh ta nhấp, do đó bỏ chọn tất cả văn bản.

Gọi .SelectAll () trong sự kiện .Click sẽ không hoạt động vì người dùng sẽ không thể chọn bất kỳ văn bản nào bằng chuột; lệnh gọi .SelectAll () sẽ tiếp tục ghi đè lựa chọn văn bản của người dùng.

Gọi hộp văn bản BeginInvoke ((Hành động). Chọn tất cả) vào tiêu điểm / nhập sự kiện, nhập không hoạt động vì nó phá vỡ quy tắc số 2 ở trên, nó sẽ tiếp tục ghi đè lựa chọn của người dùng.


3
Vui lòng làm rõ điều này là dành cho "RichTextBox."
Nescio

Nescio, một hộp văn bản hoặc một hộp văn bản phong phú sẽ làm. Tôi đã thử giải pháp của bạn trên một hộp văn bản quá.
Judah Gabriel Himango

Đây là một rò rỉ trừu tượng. Cách tốt nhất để làm điều đó là gắn cờ WM_MOUSEACTIVATE và Chọn Tất cả trên WM_SETFOCUS nếu không WM_MOUSEACTIVATE-ing.
wqw

Câu trả lời:


109

Trước hết, cảm ơn câu trả lời! Tổng cộng có 9 câu trả lời. Cảm ơn bạn.

Tin xấu: tất cả các câu trả lời đều có một số điểm kỳ quặc hoặc không hoạt động hoàn toàn đúng (hoặc hoàn toàn không). Tôi đã thêm một bình luận cho mỗi bài viết của bạn.

Tin tốt: Tôi đã tìm ra cách để nó hoạt động. Giải pháp này khá đơn giản và dường như hoạt động trong tất cả các tình huống (bỏ xuống, chọn văn bản, tập trung vào tab, v.v.)

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

Theo như tôi có thể nói, điều này khiến một hộp văn bản hoạt động chính xác như thanh địa chỉ của trình duyệt web.

Hy vọng rằng điều này sẽ giúp anh chàng tiếp theo cố gắng giải quyết vấn đề đơn giản này.

Cảm ơn một lần nữa, các bạn, vì tất cả các câu trả lời của bạn đã giúp dẫn tôi đến con đường chính xác.


Còn khi tiêu điểm được đặt theo chương trình thành TextBox thì sao? Tôi có vấn đề như đã thảo luận ở đây: stackoverflow.com/questions/24790704/ Nhật Tôi đã có thể giải quyết nó, sau một thời trang, nhưng tôi vẫn lo lắng về nó, vì "cách khắc phục" của tôi có vẻ khá khó khăn.
B. Clay Shannon

Bạn đã viết, "Gọi .Select ALL () trong các sự kiện. Entry hoặc .GotF Focus sẽ không hoạt động vì nếu người dùng nhấp vào hộp văn bản, dấu mũ sẽ được đặt ở nơi anh ta nhấp, do đó bỏ chọn tất cả văn bản." Tôi có Chọn Tất cả trong sự kiện GotF Focus, phần lớn, hoạt động. Trong thực tế, tôi sẽ nghĩ rằng con trỏ được đặt nơi người dùng nhấp vào là "một điều tốt." Tôi chỉ muốn nó luôn được chọn khi tiêu điểm được đặt thành TextBox theo lập trình.
B. Clay Shannon

Và tôi lại ở đây! :)
dotNET

3
Bạn nên di chuyển alreadyFocused = true;trong MouseUp ra khỏi câu lệnh if. Bởi vì nếu bạn chọn ngay các phần của văn bản, lần nhấp tiếp theo sẽ chọn lại toàn bộ văn bản.
Robert S.

Có một câu trả lời lót bên dưới --- BeginInvoke ((Hành động) MyTextBox.Select ALL); --- Đáng xem. Nó dường như làm mọi thứ cần thiết
General Grey

78

Tôi tìm thấy một giải pháp đơn giản hơn cho việc này. Nó liên quan đến việc khởi động Chọn Không đồng bộ bằng cách sử dụng Control.BeginInvokeđể xảy ra sau khi các sự kiện Enter và Click xảy ra:

Trong C #:

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

Trong VB.NET (cảm ơn Krishanu Dey )

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

5
Câu trả lời thông minh nhất mà tôi từng tìm thấy .. Cảm ơn rất nhiều .. Đối với VB.net Đây là Giải pháp .. Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Krishanu Dey

Lớp nhiều 'Giải pháp tốt nhất, thanh URL của trình duyệt web, Lớp cuối nhiều lớp
ar.dll

7
Trong .Net 4.0, bạn có thể thực hiện: BeginInvoke ((Hành động) MyTextBox.Select ALL);
JoelFan

2
Thật không may, BeginInvoke không hoạt động với tôi (chắc chắn là do phiên bản Dot net bụi bặm của tôi). Chuẩn bị "Kiểm soát." không có ích gì, cũng như không đặt trước tên của TextBox. Một mình, và lảng vảng lảng vảng ...
B. Clay Shannon

2
Lưu ý rằng giải pháp này không hoạt động chính xác như được mô tả trong câu hỏi. Cụ thể Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.không hoạt động như mong muốn. Nhưng vẫn là giải pháp ngắn gọn và thanh lịch nhất :)
Marcus Mangelsdorf

30

Giải pháp của bạn là tốt, nhưng thất bại trong một trường hợp cụ thể. Nếu bạn tập trung vào TextBox bằng cách chọn một phạm vi văn bản thay vì chỉ nhấp, thì cờ đã được cài đặt sẽ không được đặt thành đúng, vì vậy khi bạn nhấp vào TextBox lần thứ hai, tất cả văn bản sẽ được chọn.

Đây là phiên bản của tôi về giải pháp. Tôi cũng đã đặt mã vào một lớp kế thừa TextBox, vì vậy logic được ẩn đi một cách độc đáo.

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 cho đề xuất hộp văn bản tùy chỉnh và giải pháp làm việc hoàn hảo!
Cung cấp nhiên liệu

Giải pháp tuyệt vời. Sao chép mã của bạn ngay vào giải pháp của tôi, thay đổi không gian tên để bảo vệ người vô tội và hoạt động hoàn hảo. Cảm ơn!
kenswdev

8

Đó là một chút bùn, nhưng trong sự kiện nhấp chuột của bạn, sử dụng SendKeys.Send( "{HOME}+{END}" );.


Ái chà! Đó là một chút của tin tặc! :-) Cám ơn vì sự gợi ý. Còn ý tưởng nào hay hơn không?
Judah Gabriel Himango

Thực sự hack, nhưng điều này nghe có vẻ không tệ chút nào
Terry

3
Hãy xem xét rằng rất nhiều chương trình chống vi-rút chặn và chặn SEND KEYS là độc hại. Đó không phải là một giải pháp tuyệt vời.
Judah Gabriel Himango

4

Bấm vào sự kiện của hộp văn bản? Hoặc thậm chí sự kiện MouseCaptureChanged hoạt động với tôi. - ĐỒNG Ý. không hoạt động.

Vì vậy, bạn phải làm 2 việc:

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

Cũng hoạt động để gắn thẻ (thông qua các hộp văn bản đến một) - gọi Chọn Tất cả () trong Enter chỉ trong trường hợp ...


Ok Jakub, một phần hoạt động. Nếu tôi tab vào hộp văn bản, nó cần phải tập trung. Điều đó sẽ làm việc với giải pháp của bạn? (Nếu bạn có thể chỉ cho tôi cách, tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời đúng.)
Judah Gabriel Himango

Jakub, bây giờ bạn đã đăng mã, đôi khi nó dường như hoạt động. Không phải lúc nào cũng vậy; ngay bây giờ tôi đang nhấp vào hộp văn bản và nó không chọn tất cả.
Judah Gabriel Himango

Đôi khi tôi sẽ nhấp vào văn bản và nó không chọn tất cả. Giống như bằng cách nào đó, trường .f không được đặt thành đúng như vậy, và sau đó Chọn Tất cả sẽ không được gọi. Không thấy điều này?
Judah Gabriel Himango

Tôi chỉ biết rằng vì mouseMouve, bạn có thể nhấp chậm trong khi di chuyển chuột (đặc biệt là trên các chữ cái rộng) -> bỏ đặt cờ. Bạn có thể loại bỏ các mã trong sự kiện MouseMove, nhưng hơn bạn nhận được - sau tabbgin để kiểm soát và sau đó nhấp vào - reSelectAll - không thể chọn một phần của stirng trên kéo đầu tiên
Jakub Kotrla

4

Câu trả lời một dòng mà tôi sử dụng ... bạn có thể tự đá mình ...

Trong sự kiện Enter:

txtFilter.BeginInvoke (new MethodInvoker (txtFilter.Select ALL));


1
Không, không làm việc. Nó chọn tất cả văn bản, ổn, nhưng nó cũng ngăn người dùng chọn chỉ một phần của văn bản, trong số các vấn đề khác.
Judah Gabriel Himango

Xin lỗi, tôi đã hiểu lầm hành vi bạn đang tìm kiếm. Khi nhập, nó sẽ chọn tất cả, nếu bạn nhấp và giữ nó sẽ chọn từ đầu đến con trỏ của bạn. Tôi cho rằng bạn có thể sử dụng những gì tôi có và thay thế Chọn Tất cả bằng logic chọn của riêng bạn. notifywire.com/demos/2009-04-14_1248.swf

Hoạt động tuyệt vời! Nhấp chuột đầu tiên vào hộp; sau đó nhấp và kéo để chọn văn bản.
D_Bester

Lưu ý: nó không hoạt động như thanh địa chỉ của trình duyệt web. Thanh địa chỉ của trình duyệt web cho phép bạn di chuột xuống trong hộp văn bản và kéo / chọn, ngay cả khi hộp văn bản chưa có tiêu điểm. Giải pháp này không giải quyết được điều đó. Nếu bạn ổn với điều đó, tuyệt, nhưng nó không đáp ứng các yêu cầu của câu hỏi này.
Judah Gabriel Himango

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

Ok, sau khi thử nó ở đây là những gì bạn muốn:

  • Trên sự kiện Enter, bắt đầu một cờ cho biết bạn đã tham gia sự kiện Enter
  • Trong sự kiện Click, nếu bạn đặt cờ, hãy gọi .Select ALL () và đặt lại cờ.
  • Trong sự kiện MouseMove, đặt cờ đã nhập thành false, điều này sẽ cho phép bạn nhấp vào tô sáng mà không cần phải nhập hộp văn bản trước.

Điều này đã chọn tất cả văn bản trên mục nhập, nhưng cho phép tôi đánh dấu một phần của văn bản sau đó hoặc cho phép bạn đánh dấu vào lần nhấp đầu tiên.

Theo yêu cầu:

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

Đối với tôi, việc gắn thẻ vào điều khiển sẽ chọn tất cả văn bản.


Giải pháp của bạn tương tự như giải pháp của Jakub. Nó hoạt động để nhấp. Nó có thể làm việc khi tab vào hộp văn bản? (Ví dụ: gắn thẻ vào thanh địa chỉ của trình duyệt của bạn cũng sẽ chọn tất cả văn bản.)
Judah Gabriel Himango

Có nó hoạt động cho tab quá. Tôi đã viết một ứng dụng thử nghiệm và đây là cách mà tôi đã làm cho nó hoạt động.
MagicKat

Dường như không hoạt động để lập bảng. Bạn có thể chỉ cho chúng tôi mã đang hoạt động để lập bảng không?
Judah Gabriel Himango

3

Đây là một hàm trợ giúp đưa giải pháp lên cấp độ tiếp theo - tái sử dụng mà không cần kế thừa.

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

Để sử dụng điều này, chỉ cần gọi hàm truyền qua TextBox và nó sẽ xử lý tất cả các bit lộn xộn cho bạn. Tôi đề nghị kết nối tất cả các hộp văn bản của bạn trong sự kiện Form_Load. Bạn có thể đặt chức năng này trong biểu mẫu của mình hoặc nếu bạn giống tôi, ở đâu đó trong lớp tiện ích để sử dụng lại nhiều hơn.


2

Điều này làm việc cho một TextBox WPF / XAML.

    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

Điều này tương tự như câu trả lời phổ biến của nanchry , nhưng tôi thấy dễ dàng hơn khi không phải phân lớp:

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

Chọn Tất cả không bao giờ làm việc cho tôi.

Những công việc này.

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

Điều đó không giải thích cho trường hợp việc gắn thẻ vào hộp văn bản mang lại sự tập trung. Nó cũng thể hiện một số vấn đề khác được thảo luận trong chủ đề này.
Judah Gabriel Himango

1

Tôi đã tìm thấy một giải pháp thậm chí đơn giản hơn:

Để đảm bảo tất cả văn bản được chọn khi nhấp vào textBox, hãy đảm bảo rằng trình xử lý Nhấp chuột gọi trình xử lý Enter. Không cần thêm biến!

Thí dụ:

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

Điều này không hoạt động để tập trung thông qua việc gắn thẻ vào điều khiển, phải không? Ngoài ra, những gì về khi bạn muốn chọn một số văn bản mà không chọn tất cả?
Judah Gabriel Himango

Trên thực tế, nó hoạt động với tabping vào nó! Tôi vừa thử nghiệm nó trong một dự án giả bằng MS Visual C # 2010. Điều khó chịu với giải pháp này là bạn không thể chọn một số văn bản mà không chọn tất cả. Nếu bạn muốn làm điều đó, tất nhiên không cần mã, bạn chỉ cần sử dụng chuột và chọn nó (hoặc sử dụng bàn phím).
Pieter Heemeryck

Và đó là lý do tại sao giải pháp này không giải quyết được vấn đề được trình bày: nó không hoạt động giống như hộp địa chỉ trình duyệt, bởi vì bạn không thể nhấp vào từng phần của địa chỉ mà không chọn tất cả văn bản.
Judah Gabriel Himango

Ok, tôi hiểu ý của bạn. Tiêu đề của ví dụ trên thanh địa chỉ của câu hỏi và trình duyệt web không cho biết bạn sẽ có thể chọn một phần văn bản. Bạn chỉ đề cập đến điều này như một mặt trong câu cuối cùng của câu hỏi của bạn. Trân trọng.
Pieter Heemeryck

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

Tôi vừa thử nghiệm với RichTextBox. Không hoạt động. Nhấp vào hộp văn bản không xuất hiện để chọn tất cả văn bản. (Bởi vì nó được bỏ chọn trên chuột xuống, khi dấu mũ được đặt ở con trỏ.)
Judah Gabriel Himango

0

Thật thú vị, một ComboBox với DropDownStyle = Simple có khá nhiều chính xác hành vi bạn đang tìm kiếm, tôi nghĩ vậy.

(Nếu bạn giảm chiều cao của điều khiển để không hiển thị danh sách - và sau đó thêm một vài pixel nữa - không có sự khác biệt hiệu quả giữa ComboBox và TextBox.)


Thú vị, nhưng tôi thực sự cần điều này để hoạt động trên TextBox và RichTextBox.
Giu-đa Gabriel Himango

0

Tại sao bạn không đơn giản sử dụng MouseDown-Event của hộp văn bản? Nó hoạt động tốt đối với tôi và không cần thêm boolean. Rất sạch sẽ và đơn giản, ví dụ:

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

Không, có một số vấn đề với điều này: không tính đến nếu hộp văn bản đã có tiêu điểm (chúng tôi không muốn chọn - tất cả mọi con chuột đều bị hỏng, ngay khi hộp văn bản không có tiêu điểm), không cho phép bạn chọn một phần của văn bản, không hoạt động khi mang tiêu điểm thông qua việc gắn thẻ vào hộp văn bản.
Judah Gabriel Himango

0

Tôi đã gọi Chọn Tất cả trong sự kiện MouseUp và nó hoạt động tốt với tôi.

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

Vâng, hãy xem các câu trả lời khác (và nhận xét) để biết lý do tại sao điều này không hoạt động trong tất cả các tình huống.
Judah Gabriel Himango

Tôi đã không kiểm tra tab cho giải pháp này. Lỗi của tôi. Cảm ơn đã chỉ ra. Vui mừng khi thấy rằng bạn có giải pháp hoàn chỉnh ngay bây giờ. Và cũng rất vui khi biết rằng đề xuất của tôi cho MouseUp đã được đưa vào giải pháp của bạn.
Sreejith K.

0

Chỉ cần lấy một lớp từ TextBox hoặc MaskedTextBox:

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

Và sử dụng nó trên các hình thức của bạn.


Điều này không hoạt động. Để hiểu lý do tại sao, xem các câu trả lời và ý kiến ​​khác.
Judah Gabriel Himango


0

Trên thực tế GotF Focus là sự kiện phù hợp (thực sự là thông điệp) mà bạn quan tâm, vì dù bạn có kiểm soát bằng cách nào thì cuối cùng bạn cũng sẽ nhận được điều này. Câu hỏi là khi nào bạn gọi Chọn Tất cả ().

Thử cái này:

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

Ali, cái này không hoạt động. Hãy thử di chuyển xuống giữa văn bản. Giữ nút chuột trong 1 giây.
Judah Gabriel Himango

0

Đối với một nhóm các hộp văn bản trong một hình thức:

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
Điều này không hoạt động đúng; xem câu trả lời của tôi cho các câu trả lời khác gợi ý .Select ALL (). Nó không hoạt động vì nếu bạn nhập hộp văn bản trong khi cố gắng chọn văn bản, nó sẽ phá vỡ lựa chọn văn bản của bạn bằng cách chọn tất cả văn bản. Bạn chỉ muốn chọn văn bản nếu tiêu điểm được nhập vào hộp văn bản thông qua chuột lên hoặc gắn thẻ vào đó, nhưng nếu tiêu điểm được gây ra thông qua chuột xuống.
Judah Gabriel Himango

0

Tôi biết điều này đã được giải quyết nhưng tôi có một gợi ý mà tôi nghĩ thực sự khá đơn giản.

Trong sự kiện chuột lên, tất cả những gì bạn phải làm là đặt

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

Nó dường như hoạt động với tôi trong VB.NET (Tôi biết đây là câu hỏi C # ... thật đáng buồn khi tôi buộc phải sử dụng VB trong công việc của mình .. và tôi đã gặp phải vấn đề này, đó là điều đã đưa tôi đến đây ... )

Tôi chưa tìm thấy bất kỳ vấn đề nào với nó .. ngoại trừ thực tế là nó không chọn ngay lập tức khi nhấp, nhưng tôi đã gặp vấn đề với điều đó ....


1
Yêu cầu ban đầu muốn điều này hoạt động khi bạn tab vào trường.
Don Kirkby

2
Đúng, điều này không làm việc cho tất cả các kịch bản. Nó chỉ hoạt động khi bạn bấm vào hộp văn bản. Và thậm chí sau đó, nếu không hoạt động như một thanh địa chỉ trình duyệt sẽ hoạt động khi lựa chọn đã tồn tại trong hộp văn bản.
Judah Gabriel Himango

0

Các giải pháp sau đây làm việc cho tôi. Tôi đã thêm OnKeyDownOnKeyUpghi đè sự kiện để giữ cho văn bản TextBox luôn được chọn.

    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
Nó có cho phép bạn di chuột xuống hộp văn bản, kéo con trỏ của bạn để chọn một số văn bản, sau đó di chuột lên không?
Judah Gabriel Himango

0

Đặt selction khi bạn rời khỏi điều khiển. Nó sẽ ở đó khi bạn quay trở lại. Tab xung quanh biểu mẫu và khi bạn quay lại điều khiển, tất cả văn bản sẽ được chọn.

Nếu bạn đi vào bằng chuột, thì dấu mũ sẽ được đặt đúng vào điểm bạn nhấp.

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

Nếu bạn đi bằng chuột, nó sẽ chọn tất cả văn bản, trừ khi nó đã được tập trung. Điều này không hỗ trợ điều đó.
Judah Gabriel Himango

0

Giải pháp rất đơn giản:

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

EDIT: OP ban đầu đặc biệt quan tâm đến trình tự thả xuống / lựa chọn văn bản / chuột lên, trong trường hợp đó, giải pháp đơn giản ở trên sẽ kết thúc với văn bản được chọn một phần.

Điều này sẽ giải quyết * vấn đề (trong thực tế tôi chặn 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 );
    }

* Trên thực tế, chuỗi sau kết thúc bằng lựa chọn văn bản một phần nhưng sau đó nếu bạn di chuột qua hộp văn bản, tất cả văn bản sẽ được chọn lại:

di chuột xuống / lựa chọn văn bản / di chuyển chuột ra khỏi hộp văn bản / di chuột lên


Giải pháp này đã được đăng. Xem bình luận cho câu trả lời hiện có để tìm hiểu lý do tại sao nó không hoạt động.
Judah Gabriel Himango

hoạt động với tab và với chuột, bạn có thể lấy nét, chọn văn bản và sau đó di chuột lên. Tôi dường như không thể tìm thấy vấn đề với điều này. Bạn có thể vui lòng chỉ ra điều đó?
Mauro Sampietro

0

Tôi thấy công việc này tốt nhất, khi nhấp chuột và không phát hành ngay lập tức:

    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

Giải pháp của tôi khá nguyên thủy nhưng hoạt động tốt cho mục đích của tôi

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

Không hoạt động khi bạn muốn di chuột xuống để chọn một loạt văn bản, kéo chuột, sau đó di chuột lên. Mã của bạn sẽ xóa lựa chọn và chọn tất cả mọi thứ.
Judah Gabriel Himango

@JudahHimango Jup. Nếu bạn nhấp một lần, nó sẽ chọn mọi thứ. Nếu bạn nhấp và kéo nó sẽ chỉ chọn các lựa chọn. Ít nhất là Browserbar trong Firefox hiển thị chính xác hành vi này.
BlueWizard

Đó không phải là một điều kiện cuộc đua, mặc dù? Nếu tôi quản lý để nhanh chóng chọn một số văn bản bằng chuột, thì .SelectAll () sẽ kích hoạt mili giây sau đó, ghi đè lên lựa chọn của tôi.
Judah Gabriel Himango

1
Ok, nếu bạn nhanh chóng trong việc lựa chọn những thứ hơn thì điều này sẽ chống lại bạn.
BlueWizard

-1

Dưới đây dường như làm việc. Sự kiện enter xử lý việc gắn thẻ vào điều khiển và MouseDown hoạt động khi nhấp vào điều khiển.

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

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

Không may mắn, không làm việc tôi sợ. Hãy thử chọn một số văn bản. Văn bản .SelectAll ghi đè lên những gì người dùng đang cố gắng chọn.
Judah Gabriel Himango

-1

Câu trả lời có thể thực sự khá đơn giản hơn TẤT CẢ những điều trên, ví dụ (trong WPF):

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

tất nhiên tôi không thể biết bạn muốn sử dụng mã này như thế nào, nhưng phần chính cần xem xét ở đây là: Cuộc gọi đầu tiên. Lấy nét () và sau đó gọi .SelectAll ();


Điều này không hoạt động, và là một bản sao của các câu trả lời khác. Ví dụ: nếu bạn di chuột xuống trong hộp văn bản, hãy kéo, nó sẽ chọn một phần của văn bản. Điều này phá vỡ điều đó và không chọn tất cả.
Giu-đa Gabriel Himango

-1

chỉ cần sử dụng selectall () khi nhập và nhấp vào các sự kiện

private void textBox1_Enter(object sender, EventArgs e)
        {

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

Điều đó hoạt động cho đến khi bạn muốn chọn một số văn bản. Xem các câu trả lời khác cho một lời giải thích đầy đủ.
Judah Gabriel Himango

-1

Tôi đã tạo một dự án Wpf VB.Net mới. Tôi đã tạo một TextBox và sử dụng như sau cho codebehind:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.