То, чтобы заставлять WinForms TextBox вести себя как строка поиска Вашего браузера

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

151
задан Judah Gabriel Himango 4 August 2016 в 16:01
поделиться

14 ответов

В первую очередь, спасибо за ответы! 9 общих ответов. Спасибо.

Плохие новости: все ответы имели некоторые причуды или не работали совершенно верно (или вообще). Я добавил комментарий к каждому из Ваших сообщений.

Хорошие новости: я нашел способ заставить его работать. Это решение довольно просто и, кажется, работает во всех сценариях (mousing вниз, выбирая текст, снабжая вкладками фокус, и т.д.)

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

, Насколько я могу сказать, это заставляет текстовое поле вести себя точно как строка поиска веб-браузера.

, Надо надеяться, это помогает следующему парню, который пытается решить эту обманчиво простую проблему.

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

107
ответ дан Judah Gabriel Himango 23 November 2019 в 22:16
поделиться

Ниже, кажется, работает. Ввести событие обрабатывает переключение вкладок к управлению и работам MouseDown, когда управление нажато.

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

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (textBox1.Focused)
            textBox1.SelectAll();
    }
-1
ответ дан Community 23 November 2019 в 22:16
поделиться

На самом деле GotFocus является правильным событием (сообщение действительно), что Вы интересуетесь, с тех пор неважно, как Вы добираетесь до управления you’ll, получают это даже в конечном счете. Вопрос состоит в том, когда делают Вы называете 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
ответ дан Peter Mortensen 23 November 2019 в 22:16
поделиться

Вы попробовали решение, предложенное на Форуме MSDN "Windows Forms, Общие" , который просто разделяет TextBox на подклассы?

0
ответ дан Peter Mortensen 23 November 2019 в 22:16
поделиться

Почему Вы просто не используете Событие mouseDown текстового поля? Это хорошо работает для меня и не нуждается в дополнительной булевской переменной. Очень чистый и простой, например:

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }
0
ответ дан 23 November 2019 в 22:16
поделиться

Нажать событие текстового поля? Или даже событие MouseCaptureChanged работает на меня. - Хорошо. не работает.

, Таким образом, необходимо сделать 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; 
}

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

4
ответ дан Jakub Kotrla 23 November 2019 в 22:16
поделиться

Это - немного kludgey, но в Вашем событии щелчка, используйте SendKeys.Send( "{HOME}+{END}" );.

8
ответ дан bluish 23 November 2019 в 22:16
поделиться
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();
    }
}
0
ответ дан Nescio 23 November 2019 в 22:16
поделиться
'Inside the Enter event
TextBox1.SelectAll();

хорошо, после попытки это вот - то, что Вы хотите:

  • На событии Enter запускают флаг, который указывает, что Вы были во ввести событии
  • На событии Click при установке флага назовите.SelectAll () и сбросьте флаг.
  • На Событии mouseMove, набор вводимый флаг ко лжи, которая позволит Вам нажимать выделение, не имея необходимость вводить текстовое поле сначала.

Это выбрало весь текст на записи, но позволило мне выделять часть текста впоследствии или позволять Вам выделяться при первом щелчке.

запросом:

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

Для меня, переключение вкладок в управление выбирает весь текст.

3
ответ дан MagicKat 23 November 2019 в 22:16
поделиться

Интересно, ComboBox с DropDownStyle=Simple имеет в значительной степени точно поведение, которое Вы ищете, я думаю.

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

0
ответ дан 23 November 2019 в 22:16
поделиться

Одна строка отвечает, что я использую..., Вы могли бы ударять себя...

Во ввести событии:

txtFilter. BeginInvoke (новый MethodInvoker (txtFilter. SelectAll));

4
ответ дан 23 November 2019 в 22:16
поделиться

Я вызвал 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
ответ дан 23 November 2019 в 22:16
поделиться

Просто возьмите класс из TextBox или MaskedTextBox:

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

и используйте его на своих формах.

0
ответ дан 23 November 2019 в 22:16
поделиться

Я создал новый проект VB.Net Wpf. Я создал один 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
-1
ответ дан 23 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: