0

我在表单中有一些控件,因此我在表单中读取并创建了一个事件,允许我按下ENTER以将焦点更改为另一个控件。这是代码:

private void frSeleccionEL_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            Control nextControl = this.GetNextControl(ActiveControl, !e.Shift);
            if (nextControl != null)
            {
                e.Handled = true;
                if (!(nextControl is Label))
                {
                    nextControl.Focus();
                }
                else //the next control is currently a label
                {
                    nextControl = this.GetNextControl(ActiveControl, true);
                    while (nextControl != null)
                    {
                        nextControl.Focus();
                        if (!(nextControl is Label))
                        {
                            break;
                        }
                        nextControl = this.GetNextControl(ActiveControl, true);
                    }
                }
            }
        }
    }

在它不起作用的文本框中,我只有数字的代码。这是代码:

private void txtLocal_KeyPress(object sender, KeyPressEventArgs e)
    {
        //Para obligar a que sólo se introduzcan números
        if (Char.IsDigit(e.KeyChar))
        {
            e.Handled = false;
        }
        else
        {
            if (Char.IsControl(e.KeyChar)) //permitir teclas de control como retroceso
            {
                e.Handled = false;
            }
            else
            {
                //el resto de teclas pulsadas se desactivan
                e.Handled = true;
            }
        }      
    }

我的问题是,当我按下ENTER此控件时,什么也没有发生,就像ENTER从未按下过一样,因为此控件的事件按键不会触发。

我删除了控件并重新制作了它,但问题仍然存在。

我不知道出了什么问题。

4

5 回答 5

1

您的第一个代码太长,我们不需要它。如果您想将 Enter 按键转换为 Tab 开关,请使用SelectNextControl您的表单方法。我可以看到你txtLocal_KeyPress对切换选项卡没有任何作用,所以你怎么知道发生了什么。e.Handled仅有助于抑制按键事件。我猜你TextBoxMultiline = true;并且你想抑制 Enter 按键,而是切换到下一个控件,否则你不必在TextBoxwith中抑制 Enter 按键Multiline=false。这个简短的代码将帮助您:

private void txtLocal_KeyPress(object sender, KeyPressEventArgs e){
    if(e.KeyChar == 13)//Enter{
        e.Handled = true;
        SelectNextControl(txtLocal, true, true, true, true);
    }
}

这就是为了解决你的问题。我不确定您是否知道如何KeyPress使用 TextBox.KeyPress 事件注册事件处理程序,因此我在此处添加此内容以在这种情况下为您提供帮助:

txtLocal.KeyPress += txtLocal_KeyPress;
于 2013-06-26T01:59:15.423 回答
0

尝试这个:

 private void txtLocal_KeyPress(object sender, KeyPressEventArgs e)
    {
        //Para obligar a que sólo se introduzcan números
        if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) )
        {
            e.Handled = true;
        }
    }
于 2013-06-25T16:21:26.963 回答
0

尝试这个 ......

private void txtLocal_KeyPress(object sender, KeyPressEventArgs e)
    {
        //Para obligar a que sólo se introduzcan números
        if (Char.IsDigit(e.KeyChar) || asc(e.KeyChar)==13)
        {
            e.Handled = false;
        }
        else
        {
            if (Char.IsControl(e.KeyChar)) //permitir teclas de control como retroceso
            {
                e.Handled = false;
            }
            else
            {
                //el resto de teclas pulsadas se desactivan                
                e.Handled = true;

            }
        }      
    }
于 2013-06-25T16:50:19.410 回答
0

请在表单键上使用此代码,这将为您提供更好的性能

private void frSeleccionEL_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
    {
       ProcessTabKey(true);
     }
}

请确保您已在所有控件上设置选项卡索引。

然后更改您的文本更改事件代码。如果您使用自定义文本框而不是在所有表单上编写此代码会更好。

于 2013-06-25T16:25:30.390 回答
0

如果您想使用回车键提交您的更改,假设您想更新您的数据绑定,但留在控件中,您可以使用以下代码

private void TextBox_KeyPress(object sender, EventArgs e)
{
   if(e.KeyCode == (char)Keys.Enter)
   {
      TextBox.DataBindings[0].WriteValue();
      dataBindingSource.ResetCurrentItem();
      TextBox.Select(TextBox.Text.Length, 0);
      e.Handled = true;
   }
}

重要的部分是 WriteValue() 在数据绑定事件触发之前提交更改。如果您希望其他控件在提交更改后更新您的表单,ResetCurrentItem() 将执行此操作。此外,此代码仅提交第一个绑定值,但如果您有多个绑定,则可以使用 foreach 循环和 WriteValue() 全部或其他方式逐步执行它们。TextBox.Select() 行只是将光标保持在按 Enter 后离开的位置。

于 2015-02-12T14:57:03.997 回答