0

我只想让用户输入 0..9, "." 和我的 DGV 中的退格键。我认为 KeyDown 事件可能是门票,如下所示:

private void dataGridViewPlatypi_KeyDown(object sender, KeyEventArgs args)
{
    args.Handled = !args.KeyCode.Equals(Keys.Decimal); // etc. - add other allowed vals
    if (args.Handled)
    {
        args.SuppressKeyPress = true;
    }
}

...但这不起作用/没有效果。

我研究并发现:DataGridView keydown event not working in C#

...这导致我创建了一个自定义 DGV 类:

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
    if ((!keyData.Equals(Keys.Decimal)) &&
        (!keyData.Equals(Keys.???))) // etc.
    {
        //suppress the key somehow
    }
    return base.ProcessCmdKey(msg, keyData); // <-- should this be in an "else" block?
}

...但正如你可以从“???” 和“不知何故”的评论,我不知道如何测试我想要允许的其他键(0..9 和退格键)

更新

在两位受访者的有力帮助下,它现在运行良好:

我在这里开始使用 Hans Passant 的代码来创建自定义 DGV 派生控件来解决可移动的最后一行问题:

在c#中删除datagrid中的空白灰色空间

...然后添加基于 LarsTech 的代码以过滤掉 DGV 中不需要的条目。

准确地说,这是我用来覆盖 ProcessCmdKey() 的确切逻辑:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (char.IsNumber(Convert.ToChar(keyData)) || 
        char.IsControl(Convert.ToChar(keyData)) || 
        (keyData >= Keys.NumPad0 && keyData <= Keys.NumPad9) ||
        (keyData == Keys.Space) ||
        (keyData == Keys.Back) ||
        (keyData == Keys.Decimal))
    {
        return false;
    }
    return true;
}
4

1 回答 1

1

处理文本输入控件的键几乎从来不是 100%。您可能希望在此代码项目的 DataGridView 中使用 MaskedTextBox 控件进行调查。

对于覆盖,此代码将使您关闭:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (
    (keyData >= Keys.D0 && keyData <= Keys.D9) ||
    (keyData >= Keys.NumPad0 && keyData <= Keys.NumPad9) ||
    (keyData == Keys.Decimal | keyData == Keys.OemPeriod) ||
    (keyData == Keys.Back | keyData == Keys.Delete) ||
    (keyData == Keys.Left | keyData == Keys.Up | keyData == Keys.Right | keyData == Keys.Down) ||
    (keyData == Keys.Tab | keyData == Keys.Home | keyData == Keys.End | keyData == Keys.Enter)
    ) {
    return false;
  }

  return true;
}
于 2012-09-26T17:01:11.497 回答