【发布时间】: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 这也是非常有用的建议,非常感谢您将这种情况放在我的雷达上!