2016-08-02 42 views
-1

我有格式化文本看起来像(###)###一MaskedTextBox中 - ####MaskedTextBox中检测标签

进入第一3位数字之后,他们喜欢按 “TAB”到下一集。不幸的是,按TAB,他们在下一个领域。

因此,我的老板让我修改应用程序,以便用户保持在同一个字段,但光标在下一个组。

private void maskedTextBoxHomePhone_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     MaskedTextBox mtb = (MaskedTextBox)sender; 
     if (e.KeyChar == (char)Keys.Tab) 
     { 
      if (mtb.TextLength == 3) 
      { 
       mtb.SelectionStart = 4; 
      } 
     } 
    } 

我也试过

private void maskedTextBoxHomePhone_KeyDown(object sender, KeyEventArgs e) 
    { 
     MaskedTextBox mtb = (MaskedTextBox)sender; 
     if (e.KeyCode == Keys.Tab) 
     { 
      if (mtb.TextLength == 3) 
      { 
       mtb.SelectionStart = 4; 
      } 
     } 
    } 

回答

0

标签具有特殊的意义,这将导致重心发生变化,因此事件处理程序将不会被调用。

您可以解决此通过使用文本框的Leave事件和计数您已存储在某些局部变量的长度限制:Textlength:

private void maskedTextBoxHomePhone_Leave(object sender, EventArgs e) 
{ 
    if (_mtbTextLength == 3) { //change selection start and goes back to masked text box } 
} 

不管怎么说,其实我会尽力说服我的老板除此以外。 真的需要这个吗?标签总是用来改变字段,你可以得到 你的用户感到困惑。

另一种办法是通过覆盖给ProcessCmdKey更改选项卡的行为:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == Keys.Tab) 
    { 
     //Do something 
    } 
} 
+0

当我使用ProcessCmdKey,它不允许任何其他字符到现场 –

+0

那么也许你应该尝试我给出的第一个选项...如果TextLength == 3,则应将焦点返回到蒙版文本框并将选择开始设置为4 .. – Forlani