C# datagrid内部的事件处理问题..一个BUG?
我不知道为什么每隔一天我就会在datagrid中遇到一个奇怪的情况。这次真的很烦人。所以我试图在datagrid中处理Enter键,但似乎出现了一个问题。正如我们所知,datagrid中Enter键的默认行为是向下移动一行,而我想做的是做其他事情,现在我不知道为什么,但即使我使用keydown事件覆盖该行为,它也拒绝这样做。 以下是xaml代码:C# datagrid内部的事件处理问题..一个BUG?,c#,.net,wpf,datagrid,event-handling,C#,.net,Wpf,Datagrid,Event Handling,我不知道为什么每隔一天我就会在datagrid中遇到一个奇怪的情况。这次真的很烦人。所以我试图在datagrid中处理Enter键,但似乎出现了一个问题。正如我们所知,datagrid中Enter键的默认行为是向下移动一行,而我想做的是做其他事情,现在我不知道为什么,但即使我使用keydown事件覆盖该行为,它也拒绝这样做。 以下是xaml代码: 下面是隐藏的代码,即应该调用的代码: private void dataGrid1_KeyDown(object sender, KeyEvent
下面是隐藏的代码,即应该调用的代码:
private void dataGrid1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
String date = (dataGrid1.Items[(dataGrid1.SelectedIndex-1)] as DailyTransaction).date
EnterTransaction transaction = new EnterTransaction(DateTime.Parse(date));
transaction.ShowDialog();
ListofTransaction.reloadData();
return;
}
else if (e.Key == Key.F2)
{
insertNewRow();
return;
}
else if (e.Key == Key.C)
{
ignoreSundays = true;
insertNewRow();
ignoreSundays = false;
}
else if (e.Key == Key.Escape)
{
this.Close();
}
}
现在有趣的是,Escape键在这个场景中运行良好。我不知道这里有什么问题,或者可能是我遗漏了一些非常简单的东西???使用
PreviewKeyDown
而不是KeyDown
事件处理程序
除了所有其他帖子之外,我强烈建议在本例中,当您要覆盖默认行为时,通过继承BCL中的一个来创建DataGrid类,并覆盖事件,而不仅仅是订阅它
在本例中,第一个运行内置代码,第二个运行后引发事件,因此代码将被执行。通过重写派生类中的事件,您可以更改行为。@Sudh:wird,我在我的末尾尝试过,结果成功了。难道你没有在事件处理程序中结束吗?哦,我的糟糕..它起作用了,没有注意到e.Handled=true语句..顺便说一句,我们不知道为什么会发生,这不是很奇怪吗,我的意思是人们以前一定遇到过这个问题……您是否尝试过使用
键。Return
而不是键。Enter
?您是否尝试过keypup而不是keypdown?我模模糊糊地记得有某种行为与此有关,但目前我无法确定。这可能是一个隧道事件与冒泡事件的对比,在你处理之前,控件的模板会将其吞没。@Wonko the Sane;是的,这解决了问题,但也带来了更多的新问题,因为启动钥匙的时间太多了。。。。
private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
// Do stuff..
e.Handled = true;
}
}