首先向所有人致以问候,因为这是我的第一篇文章。
我是C#的新手,所以可能解决方案很明显。
我有一个包含姓名和日期数据的datagridview。双击日期列时,会显示datetimepicker以选择日期。如果击中了Escape,则隐藏datetimepicker并使旧数据生效。 当代码运行时,如果我双击最后一行中的日期列,则会弹出datetimepicker,但不会被读取。 如果在最后一行之前的某一行中完成相同的操作,则esc正常工作。 如果首先在另一行中然后在最后一行中完成相同的操作,则esc再次正常工作。 唯一的问题是在最后一行首次激活datetimepicker。也代表回车键
用于键读取和datetimepicker处理
private void dateTimePicker1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) { CellAddValue(1, dateTimePicker1.Value); }
if (e.KeyCode == Keys.Escape) { CellAddValue(1, dateWhenSelDate); }
}
public void CellAddValue(int o, DateTime date)
{
string dateString = date.ToString(dateFormat);
if (DateTime.Compare(date, dateTimePicker1.MinDate) == 0) { dateString = ""; }
dataGridView1.Rows[selectedRow].Cells[selectedColumn].Value = dateString;
if (o == 1)
{
dateTimePicker1.Hide();
dataGridView1.Focus();
}
}
我必须设置一些设置或选项才能工作吗? 感谢
答案 0 :(得分:3)
答案 1 :(得分:0)
要详细控制所有按键,您可以覆盖表单的ProcessCmdKey方法,这样就可以拦截所有键事件:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
string keyName = keyData.ToString(); // You might rather use the Keys. enum
if ("Escape".Equals(keyName))
{
Action();
return true; // If you return true the key event won't be treated any further
}
else // pass the key on to your forms, they will be treated as if this method wasn't here
{
return base.ProcessCmdKey(ref msg, keyData);
}
}
我通常在
中使用它formInstance.KeyPreview = true;