2012-03-03 35 views
0

当下面的DataGrid首次获取焦点并且只是第一次(即,在某个其他控件获得焦点后)时,最后一行第二列应该被聚焦并进行编辑。DataGrid以编程方式选择最后一个单元

enter image description here

我增加了对DataGrid.GotFocus的处理程序,但它是复杂的代码,并没有得到上面的结果。

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

干杯,
Berryl

编辑

我做了小小的修改代码

  1. 发送者应该总是我想要的网格,所以我只是用依托,与其一个名字
  2. 当SelectionUnit是FullRow时,由于之前我的网格已将其更改为CellOrRowHeader,因此您需要 ap parently不能打电话SelectedCells.Clear()

    私人无效OnDataGridKeyboardGotFocus(对象发件人,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; 
    

    }

新问题

我想当焦点转到窗口中的另一个控件然后返回到网格时重复选择。 我想我可以把那_hasHadInitialFocus锁定到虚假的LostFocus事件,但下面的代码是射击细胞的变化。 你知道我应该如何俘获失去焦点的事件更好,你是否同意是把锁住的地方吗?

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

另一个新问题!

我找到的DataGrid是一个皮塔饼和短期上有用的信息。最好的链接(Vin Sibal,Jamie Rodriquez)都很旧(当它是ToolKit的一部分时)。

你知道的任何更新后的基准是真的好?

+0

也许你可以看看e.NewFocus,e.OldFocus,e.OriginalSource在DataGridLostFocus,做一些聪明的那些。我担心DataGrid上的信息来源可能与您的相同。 MSDN,StackOverflow和大量的实验。 – Phil 2012-03-04 09:35:52

回答

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; 
     } 
    } 
+0

伟大的代码 - 请参阅我的编辑的职位的一些意见和后续问题或三: - )。干杯 – Berryl 2012-03-04 00:27:48

相关问题