事情是这样的,项目中使用了DotNetBar组件,其中一个界面使用了TextBoxX,并设置为多行输入。运行后发现这个输入框不接收回车事件。原因是DotNetBar把控件的回事事件变成了Tab事件,使得按回车可以在控件之间进行切换。但对于多行的TextBoxX,明显是要回车的,看来这是DotNetBar的一个BUG了(也许是一个未考虑到的应用场景)。既然它没有处理,我手动处理一下也行,也就是加一个事件几行代码的事情。于是有了下面的代码:
private void txtContent_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) && !e.Control && !e.Shift && !e.Alt)
{
e.Handled = true;
txtContent.AppendText("\r\n");
}
}
{
if (e.KeyCode == Keys.Enter) && !e.Control && !e.Shift && !e.Alt)
{
e.Handled = true;
txtContent.AppendText("\r\n");
}
}
然后就杯具了,if中的代码不论怎么样都不执行。断点调试后才发现,这两个值e.KeyCode 和 Keys.Enter这两个值确实不相等,看来DotnetBar的控件在内部进行了一些处理。最后试了下面的方法才生效:
if ((e.KeyCode == (Keys.Enter & ~Keys.MButton)) && !e.Control && !e.Shift && !e.Alt)
心中无限感慨,人不能NB到连这样的参数也要修改!最后的完整的代码是:
private void txtContent_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == (Keys.Enter & ~Keys.MButton)) && !e.Control && !e.Shift && !e.Alt)
{
e.Handled = true;
e.SuppressKeyPress = true;
txtContent.AppendText("\r\n");
}
}
{
if ((e.KeyCode == (Keys.Enter & ~Keys.MButton)) && !e.Control && !e.Shift && !e.Alt)
{
e.Handled = true;
e.SuppressKeyPress = true;
txtContent.AppendText("\r\n");
}
}