【问题标题】:Get currently selected cell on Enter pressed in a datagrid C# WPF在数据网格 C# WPF 中按下 Enter 时获取当前选定的单元格
【发布时间】:2018-02-03 19:09:22
【问题描述】:

我是 C# 新手。当我按下回车键并在其他地方使用该值时,我一直在尝试捕获我当前选择的数据网格单元格中的值。我目前正在使用带有此处理程序的 KeyUp 事件:

private void Cell_OnKeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        DataGrid dg = (DataGrid) sender;
        var u = e.OriginalSource as UIElement;
        e.Handled = true;
        u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));   
        MyType mo = (MyType) dg.CurrentItem;
        DoSomething(mo);
    }
}

数据网格中 Enter 键的默认行为是退出编辑并向下移动到下面的单元格,除非位于数据网格的底部。

上面的处理程序工作正常,除了当我在数据网格的底部时。我最终获取了上面单元格的值...

我尝试了一些类似这样的技巧:

bool notEnd = u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
if (notEnd)
{
    u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
}   
u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));

但后来我遇到了无法区分底部两个单元格的问题。

所以我想我有两个问题,我很高兴回答任何一个:

1.有没有办法确定您何时位于数据网格的底行?

2。有没有办法覆盖数据网格中按下回车键的默认行为?

如果有任何建议,我将不胜感激。谢谢。

【问题讨论】:

  • 你使用 KeyUp 事件有什么原因吗?
  • @phi1010 我的 KeyDown 通常不成功(似乎没有执行我的 DoSomething() 代码,当时我处于无法调试的情况......我应该可能用断点重新审视它),我看到其他人使用 KeyUp!可能不是一个很好的答案/原因。
  • KeyUp 与 Enter 结合使用也有一些非常糟糕的副作用:想象一下,当您的 DataGrid 被选中时会出现一个 MessageBox(这甚至可能来自另一个应用程序)。 MessageBox-es 通常在 KeyDown 时关闭,因此当我在 MessageBox 上按 Enter 而不是使用鼠标时,我也会触发您的 Datagrid 操作。
  • @phi1010 这也是非常有用的建议,非常感谢您将这种情况放在我的雷达上!

标签: c# wpf datagrid enter


【解决方案1】:

2.: 是的,你可以,看 Override the enter key, but keep default behavior for other keys in a wpf datagrid

Short:派生一个自定义 NoEnterDataGrid 类,并防止基类在输入按下时处理 OnKeyDown()。

1.:使用 KeyDown 事件可能会有所帮助,因为它可能在单元格选择移动之前执行。如果您不想立即执行操作,请将当前单元格存储在 KeyDown 中,然后在 KeyUp 中执行您的操作 - 但请注意,如果用户在按住 Enter 键的同时单击数据网格,这可能会导致奇怪的行为。

【讨论】:

  • 非常感谢!我将根据您的建议来回答问题 #1。我一直在考虑这些方面的事情,但实际上没有任何实现。我不能给你+1,因为我太新了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2014-07-21
  • 2010-12-06
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
相关资源
最近更新 更多