Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# datagrid内部的事件处理问题..一个BUG?_C#_.net_Wpf_Datagrid_Event Handling - Fatal编程技术网

C# datagrid内部的事件处理问题..一个BUG?

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

我不知道为什么每隔一天我就会在datagrid中遇到一个奇怪的情况。这次真的很烦人。所以我试图在datagrid中处理Enter键,但似乎出现了一个问题。正如我们所知,datagrid中Enter键的默认行为是向下移动一行,而我想做的是做其他事情,现在我不知道为什么,但即使我使用keydown事件覆盖该行为,它也拒绝这样做。 以下是xaml代码:


下面是隐藏的代码,即应该调用的代码:

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;
    }
}