Поместите каретку в поле MaskedTextbox - PullRequest
21 голосов
/ 23 сентября 2008

Я хотел бы иметь возможность переопределить поведение по умолчанию для размещения каретки в замаскированном текстовом поле.

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

Я знаю, что вы можете скрыть каретку, как упомянуто в этом посте , есть ли что-то похожее для позиционирования каретки в начале текстового поля, когда элемент управления получает фокус.

Ответы [ 8 ]

28 голосов
/ 23 сентября 2008

Это должно сработать:

    private void maskedTextBox1_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            maskedTextBox1.Select(0, 0);
        });         
    }
10 голосов
/ 14 января 2009

Чтобы улучшить рабочее решение Аббаса, попробуйте это:

private void ueTxtAny_Enter(object sender, EventArgs e)
{
    //This method will prevent the cursor from being positioned in the middle 
    //of a textbox when the user clicks in it.
    MaskedTextBox textBox = sender as MaskedTextBox;

    if (textBox != null)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            int pos = textBox.SelectionStart;

            if (pos > textBox.Text.Length)
                pos = textBox.Text.Length;

            textBox.Select(pos, 0);
        });
    }
}

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

Я считаю, что это более близко имитирует стандартное текстовое поле. Единственный оставшийся сбой (который я вижу) состоит в том, что после события «Enter» пользователь все еще может выбрать остальную часть (пустой) маскирующей подсказки, если xe удерживает мышь и тащит до конца.

6 голосов
/ 19 марта 2010

Это значительное улучшение по сравнению с поведением по умолчанию для MaskedTextBoxes. Спасибо!

Я внес несколько изменений в превосходное решение Измаила. Я предпочитаю вызывать BeginInvoke, только если курсор необходимо переместить. Я также вызываю метод из различных обработчиков событий, поэтому входным параметром является активный MaskedTextBox.

private void    maskedTextBoxGPS_Click( object sender, EventArgs e )
{
    PositionCursorInMaskedTextBox( maskedTextBoxGPS );
}


private void    PositionCursorInMaskedTextBox( MaskedTextBox mtb )
{
  if (mtb == null)    return;

  int pos = mtb.SelectionStart;

  if (pos > mtb.Text.Length)
    this.BeginInvoke( (MethodInvoker)delegate()  { mtb.Select( mtb.Text.Length, 0 ); });
}
3 голосов
/ 10 июня 2011
//not the prettiest, but it gets to the first non-masked area when a user mounse-clicks into the control
private void txtAccount_MouseUp(object sender, MouseEventArgs e)
{
  if (txtAccount.SelectionStart > txtAccount.Text.Length)
    txtAccount.Select(txtAccount.Text.Length, 0);
}
3 голосов
/ 23 сентября 2008

Частичный ответ: вы можете расположить каретку, назначив элемент управления длиной 0 для элемента управления в событии MouseClick, например ::

MaskedTextBox1.Select(5, 0)

... установит курсор в положение 5-го символа в текстовом поле.

Причина, по которой этот ответ является лишь частичной, заключается в том, что я не могу придумать надежного способа определения позиции, в которой каретка должна быть размещена при нажатии. Это может быть возможно для некоторых масок, но в некоторых распространенных случаях (например, маска номера телефона в США), я не могу придумать простой способ отделить маску и символы приглашения от фактического пользовательского ввода ...

0 голосов
/ 22 марта 2018

В этом решении используется метод Click в MaskedTextBox, такой как Gman Cornflake; однако я счел необходимым разрешить пользователю щелкать внутри MaskedTextBox, когда он содержит данные и курсор остается там, где он есть.

В приведенном ниже примере отключаются запросы и литералы и оценивается длина данных в MaskedTextBox, а если оно равно 0, курсор помещается в начальную позицию; в противном случае он просто обходит код, который помещает курсор в начальную позицию.

Код написан на VB.NET 2017. Надеюсь, это поможет!

Private Sub MaskedTextBox1_Click(sender As Object, e As EventArgs) Handles MaskedTextBox1.Click
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    If Me.MaskedTextBox1.Text.Length = 0 Then
        MaskedTextBox1.Select(0, 0)
    End If
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.IncludePromptAndLiterals
End Sub
0 голосов
/ 19 декабря 2017

Я заставил мою работать с использованием события Click .... Invoke не требовалось.

 private void maskedTextBox1_Click(object sender, EventArgs e)
{
     maskedTextBox1.Select(0, 0);              
}
0 голосов
/ 03 сентября 2017

Это решение работает для меня. Попробуйте, пожалуйста.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

 maskedTextBox1.Select(maskedTextBox1.Text.Length, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...