Заставить WinForms TextBox вести себя как адресная строка вашего браузера - PullRequest
149 голосов
/ 19 сентября 2008

Когда текстовое поле C # WinForms получает фокус, я хочу, чтобы оно велось как адресная строка вашего браузера.

Чтобы увидеть, что я имею в виду, нажмите в адресной строке вашего браузера. Вы заметите следующее поведение:

  1. При щелчке по текстовому полю следует выделить весь текст, если текстовое поле не было предварительно сфокусировано.
  2. Мышь вниз и перетаскивание в текстовое поле должны выделить только текст, который я выделил мышью.
  3. Если текстовое поле уже выделено, нажатие не выделяет весь текст.
  4. Фокусировка текстового поля программно или с помощью клавиш клавиатуры должна выделять весь текст.

Я хочу сделать именно это в WinForms.

Предупреждение о быстром огнестрельном оружии: пожалуйста, прочитайте следующее, прежде чем ответить! Спасибо, ребята. : -)

Вызов .SelectAll () во время события .Enter или .GotFocus не будут работа , потому что если пользователь нажал текстовое поле, каретка будет размещена где он нажал, отменив все текст.

Вызов .SelectAll () во время события .Click не будет работать , потому что пользователь не сможет выделить текст мышью; вызов .SelectAll () будет перезаписывать выделенный пользователем текст.

Вызов BeginInvoke ((Action) textbox.SelectAll) при вводе события focus / enter не работает , поскольку он нарушает правило № 2, описанное выше, он будет переопределять выбор пользователя в фокусе.

Ответы [ 31 ]

0 голосов
/ 26 октября 2009

Я вызвал SelectAll внутри события MouseUp, и у меня оно работало нормально.

    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);
    }
0 голосов
/ 19 сентября 2008

Ниже, кажется, работает. Событие 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();
    }
0 голосов
/ 20 июня 2013

Установите выбор, когда вы покидаете контроль. Это будет там, когда ты вернешься. Нажмите на форму и, когда вы вернетесь к элементу управления, будет выделен весь текст.

Если вы нажмете мышкой, то каретка будет правильно размещена в том месте, где вы щелкнули.

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.SelectAll();
    }
0 голосов
/ 02 апреля 2014

Ответ может быть на самом деле гораздо более простым, чем ВСЕ из вышеперечисленного, например (в WPF):

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

конечно, я не могу знать, как вы хотите использовать этот код, но основная часть, на которую стоит обратить внимание, это: сначала вызов .Focus (), а затем вызов .SelectAll ();

0 голосов
/ 14 апреля 2015

просто используйте selectall () при вводе и кликните события

private void textBox1_Enter(object sender, EventArgs e)
        {

            textBox1.SelectAll();
        }
        private void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.SelectAll();
        }
0 голосов
/ 19 сентября 2008

На самом деле 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();
    }
}
0 голосов
/ 10 ноября 2008

Почему бы вам просто не использовать MouseDown-Event текстового поля? Он отлично работает для меня и не нуждается в дополнительном логическом значении. Очень чистый и простой, например .:

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }
0 голосов
/ 27 мая 2015

Я считаю эту работу лучше всего, когда щелкают мышью и не отпускают сразу:

    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 голосов
/ 19 сентября 2008

Интересно, что ComboBox с DropDownStyle = Simple, по-моему, точно соответствует поведению, которое вы ищете.

(Если вы уменьшите высоту элемента управления, чтобы не отображать список - а затем еще на пару пикселей - нет эффективной разницы между ComboBox и TextBox.)

0 голосов
/ 01 декабря 2015

Это работает для меня в .NET 2005 -

    ' * if the mouse button is down, do not run the select all.
    If MouseButtons = Windows.Forms.MouseButtons.Left Then
        Exit Sub
    End If

 ' * OTHERWISE INVOKE THE SELECT ALL AS DISCUSSED.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...