WPF DataGrid始终设置为单元格的最后位置。
在添加新行时,如何设置第一个单元格的焦点?
1.我有简单的6列,所以当我在最后一栏按Enter键时,它应该添加新行(工作正常) 2.Focus应该是添加的行的第一个单元格,它不会发生它总是在最后一个单元格中
我正在附上我的WPF示例演示,请纠正我错在哪里? 演示链接:WPFDemo
谢谢你, Jitendra Jadav。
答案 0 :(得分:0)
您可以在datagrid上处理previewkeydown:
private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
var el = e.OriginalSource as UIElement;
if (e.Key == Key.Enter && el != null)
{
e.Handled = true;
el.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
标记可能很明显但是:
<DataGrid Name="dg"
...
PreviewKeyDown="dg_PreviewKeyDown"
可能会出现一些意想不到的副作用,我刚刚测试了你在最后一个单元格中输入了什么,然后你在下一行的第一个单元格中结束了。
答案 1 :(得分:0)
您可以处理CellEditEnding
事件并获取DataGridCell
的引用,如以下博文中所述。
如何在WPF中以编程方式选择和聚焦DataGrid中的行或单元格: https://blog.magnusmontin.net/2013/11/08/how-to-programmatically-select-and-focus-a-row-or-cell-in-a-datagrid-in-wpf/
这似乎对我有用:
private void dataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromItem(CollectionView.NewItemPlaceholder) as DataGridRow;
if (row != null)
{
dataGrid.SelectedItem = row.DataContext;
DataGridCell cell = GetCell(dataGrid, row, 0);
if (cell != null)
dataGrid.CurrentCell = new DataGridCellInfo(cell);
}
}
private static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
{
if (rowContainer != null)
{
DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
if (presenter != null)
return presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
}
return null;
}
private static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is T)
return (T)child;
else
{
T childOfChild = FindVisualChild<T>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}