将插入符号放置在MaskedTextbox中
时间:2020-03-06 14:34:53 来源:igfitidea点击:
我希望能够覆盖将插入号放置在蒙版文本框中的默认行为。
默认设置是将插入符号放置在单击鼠标的位置,被屏蔽的文本框已包含由于屏蔽而引起的字符。
我知道我们可以隐藏这篇文章中提到的插入符号,当控件获得焦点时,是否可以将插入符号放置在文本框的开头。
解决方案
这应该可以解决问题:
private void maskedTextBox1_Enter(object sender, EventArgs e) { this.BeginInvoke((MethodInvoker)delegate() { maskedTextBox1.Select(0, 0); }); }
部分答案:我们可以通过在MouseClick事件中为控件分配长度为0的选择来定位插入符号,例如:
MaskedTextBox1.Select(5, 0)
...将插入符号设置在文本框中的第5个字符位置。
这个答案之所以只是局部的,是因为我想不出一种通常可靠的方法来确定单击时插入符号的位置。对于某些掩码可能是可行的,但是在某些常见情况下(例如美国电话号码掩码),我真的想不出一种简单的方法来将掩码和提示字符与实际用户输入分开...
要改善Abbas的工作解决方案,请尝试以下操作:
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按住鼠标并拖动到最后,用户仍然可以选择其余的(空)掩码提示。
与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 ); }); }