Подтвердить что ты не робот

Поместите каретку в MaskedTextbox

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

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

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

4b9b3361

Ответ 1

Это должно сделать трюк:

    private void maskedTextBox1_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            maskedTextBox1.Select(0, 0);
        });         
    }

Ответ 2

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

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 удерживает мышь и тянет до конца.

Ответ 3

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

Я сделал несколько изменений в отличном решении Ishmaeel. Я предпочитаю называть 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 ); });
}

Ответ 4

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

MaskedTextBox1.Select(5, 0)

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

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

Ответ 5

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

Ответ 6

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

private void maskedTextBox1_Click(object sender, EventArgs e)
{

 maskedTextBox1.Select(maskedTextBox1.Text.Length, 0);
}

Ответ 7

Я получил свою работу, используя событие Click. Не требуется Invoke.

 private void maskedTextBox1_Click(object sender, EventArgs e)
{
     maskedTextBox1.Select(0, 0);              
}