WPF DataGrid添加新行设置焦点第一个单元格

时间:2018-04-24 08:56:28

标签: wpf datagrid focus

添加新行焦点时,

WPF DataGrid始终设置为单元格的最后位置。

在添加新行时,如何设置第一个单元格的焦点?

1.我有简单的6列,所以当我在最后一栏按Enter键时,它应该添加新行(工作正常) 2.Focus应该是添加的行的第一个单元格,它不会发生它总是在最后一个单元格中

我正在附上我的WPF示例演示,请纠正我错在哪里? 演示链接:WPFDemo

谢谢你, Jitendra Jadav。

2 个答案:

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