我只想让用户输入 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 派生控件来解决可移动的最后一行问题:
...然后添加基于 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;
}