0

所以我正在制作一个表格,我希望左右键只对应于表格上的 numericUpDown 框。所以我写的代码如下:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
         if (keyData == Keys.Right)
        {

            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        }
         if (keyData == Keys.Left)
        {
            try
            {
                numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);
            }
            catch { }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

但是,如果这是当前选定的视图,它似乎仍然执行在表单上不同对象之间移动的默认操作。如何停止默认操作?

4

4 回答 4

2

当您不希望执行默认操作时,您需要返回 true。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
     if (keyData == Keys.Right)
    {

        numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        return true;
    }
     if (keyData == Keys.Left)
    {
        try
        {
            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);
            return true;
        }
        catch { }
    }
}
于 2013-08-21T20:17:48.663 回答
1

也许您应该返回 true 以表明您已经处理了击键消息,以便没有其他控件得到它。

于 2013-08-21T20:17:16.267 回答
0
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
     if (keyData == Keys.Right){
        numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        return true;
     }
     else if (keyData == Keys.Left){
        try {
            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);              
        }
        catch { }
        return true;
    }        
    return base.ProcessCmdKey(ref msg, keyData);
}

注意:看起来您没有发布您运行的代码?我强烈建议您发布您的实际代码,您的代码甚至无法编译,因为缺少return. 而且您的代码缺少return base.ProcessCmdKey(ref msg, keyData);处理其他密钥所需的代码。

于 2013-08-21T20:16:19.757 回答
0

您可以添加一个事件处理程序并执行以下操作:

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Right || e.KeyCode == Keys.Left)
    {

        e.Handled = true; //this line will do the trick
        //add the rest of your code here. 

    }
}
于 2013-08-21T20:18:27.763 回答