Поместите курсор в MaskedTextbox.
-
02-07-2019 - |
Вопрос
Я хотел бы иметь возможность переопределить поведение по умолчанию для размещения курсора в замаскированном текстовом поле.
По умолчанию курсор размещается там, где был щелкнут мышью, замаскированное текстовое поле уже содержит символы из-за маски.
Я знаю, что вы можете скрыть каретку, как указано в этом почта, есть ли что-то подобное для размещения курсора в начале текстового поля, когда элемент управления получает фокус.
Решение
Это должно помочь:
private void maskedTextBox1_Enter(object sender, EventArgs e)
{
this.BeginInvoke((MethodInvoker)delegate()
{
maskedTextBox1.Select(0, 0);
});
}
Другие советы
Чтобы улучшить рабочее решение Аббаса, попробуйте следующее:
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);
});
}
}
Этот обработчик событий можно повторно использовать с несколькими полями, и он не лишает пользователя возможности позиционировать курсор в середине введенных данных (т. е. не переводит курсор в нулевое положение, когда поле не пусто).
Я считаю, что это более точно имитирует стандартное текстовое поле.Единственный оставшийся сбой (который я вижу) заключается в том, что после события «Ввод» пользователь все еще может выбрать остальную часть (пустого) приглашения маски, если xe удерживает мышь и перетаскивает ее до конца.
Это большое улучшение по сравнению с поведением 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 ); });
}
Частичный ответ:вы можете расположить курсор, назначив элементу управления нулевую длину в событии MouseClick, например:
MaskedTextBox1.Select(5, 0)
... установит курсор на 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);
}
Это решение работает для меня.Попробуйте, пожалуйста.
private void maskedTextBox1_Click(object sender, EventArgs e)
{
maskedTextBox1.Select(maskedTextBox1.Text.Length, 0);
}
Я заставил свой работать с помощью события Click.... Никакого вызова не требовалось.
private void maskedTextBox1_Click(object sender, EventArgs e)
{
maskedTextBox1.Select(0, 0);
}
В этом решении используется метод 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