DataGrid以编程方式选择最后一个单元格

时间:2012-03-03 03:25:09

标签: wpf datagrid focus

当下面的DataGrid第一次获得焦点并且只是第一次获得焦点时(即,在其他一些控件具有焦点之后),最后一行,第二列应该被聚焦并进行编辑。

enter image description here

我为DataGrid.GotFocus添加了一个处理程序,但它是复杂的代码而没有得到上面的结果。

任何人都有优雅的防弹解决方案吗?


我对代码进行了微小的修改

  1. 发件人应该始终是我想要的网格,所以我只是使用它而不是依赖于名称
  2. 当SelectionUnit为FullRow时,我的网格在我将其更改为CellOrRowHeader之前 显然不能调用SelectedCells.Clear()
  3. 以下代码:

    private void OnDataGridKeyboardGotFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        var dg = sender as DataGrid;
        if (_hasHadInitialFocus) return;
    
        var rowIndex = dg.Items.Count - 2;
        if (rowIndex >= 0 && dg.Columns.Count - 1 >= 0)
        {
            var column = dg.Columns[dg.Columns.Count - 1];
            var item = dg.Items[rowIndex];
            var dataGridCellInfo = new DataGridCellInfo(item, column);
    
            if (dg.SelectionUnit != DataGridSelectionUnit.FullRow) {
                dg.SelectedCells.Clear();
                dg.SelectedCells.Add(dataGridCellInfo);
            }
            else {
                var row = dg.GetRow(rowIndex);
                row.IsSelected = true;
            }
    
            dg.CurrentCell = dataGridCellInfo;
            dg.BeginEdit();
        }
    
        _hasHadInitialFocus = true;
    }
    

    新问题

    当焦点转到窗口中的另一个控件然后返回到网格时,我想重复选择。 我以为我可以在LostFocus事件中将_hasHadInitialFocus锁存器设置为false,但下面的代码会触发单元格更改。 你知道我应该如何更好地捕捉失去的焦点事件,你是否同意这是关闭闩锁的地方?

        private void DataGridLostFocus(object sender, RoutedEventArgs e) {
            _hasHadInitialFocus = false;
        }
    

1 个答案:

答案 0 :(得分:1)

你可能不得不根据是否有新的项目行显示偏移,但这对我有用。

    private bool _hasHadInitialFocus;

    private void DataGridGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        if (!_hasHadInitialFocus)
        {
            if (dataGrid.Items.Count - 2 >= 0 && dataGrid.Columns.Count - 1 >= 0)
            {
                var dataGridCellInfo = new DataGridCellInfo(
                    dataGrid.Items[dataGrid.Items.Count - 2], dataGrid.Columns[dataGrid.Columns.Count - 1]);

                dataGrid.SelectedCells.Clear();
                dataGrid.SelectedCells.Add(dataGridCellInfo);
                dataGrid.CurrentCell = dataGridCellInfo;
                dataGrid.BeginEdit();
            }

            _hasHadInitialFocus = true;
        }
    }

我注意到点击网格会选择一个单元格,目标单元格处于编辑模式。如果需要,可以解决这个问题:

    private void DataGridGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        EditCell();
    }

    private void PreviewMouseLBDown(object sender, MouseButtonEventArgs e)
    {
        if (!_hasHadInitialFocus)
        {
            e.Handled = true;
            EditCell();
        }
    }

    private void EditCell()
    {
        if (!_hasHadInitialFocus)
        {
            if (dataGrid.Items.Count - 2 >= 0 && dataGrid.Columns.Count - 1 >= 0)
            {
                var dataGridCellInfo = new DataGridCellInfo(
                    dataGrid.Items[dataGrid.Items.Count - 2], dataGrid.Columns[dataGrid.Columns.Count - 1]);

                dataGrid.SelectedCells.Clear();
                dataGrid.SelectedCells.Add(dataGridCellInfo);
                dataGrid.CurrentCell = dataGridCellInfo;
                dataGrid.BeginEdit();
            }

            _hasHadInitialFocus = true;
        }
    }