2012-03-03 3 views
0

Когда DataGrid ниже получает фокус в первый раз и только в первый раз (т. Е. После того, как какой-то другой элемент управления имел фокус), последняя строка, второй столбец должна быть сфокусирована и отредактирована.DataGrid автоматически выбирает последнюю ячейку

enter image description here

Я добавил обработчик для DataGrid.GotFocus, но это сложный код и не получить результат выше.

У каждого есть элегантное, пуленепробиваемое решение?

Приветствия,
Berryl

редактирует

Я сделал крошечные изменения в коде

  1. отправитель должен всегда быть в сетке, я хочу, так что я просто использовал, что вместо того, чтобы полагаться на a name
  2. Когда SelectionUnit является FullRow, поскольку моя сетка была до того, как я сменил ее на CellOrRowHeader, вы: ap димому не может вызвать SelectedCells.Clear()

    частная пустота OnDataGridKeyboardGotFocus (объект отправителя, KeyboardFocusChangedEventArgs е) {

    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; 
    

    }

Новый Вопрос

Я хочу повторите выбор, когда фокус переходит в другое управление в окне, а затем обратно в сетку. Я думал, что могу поменять эту защелку _hasInitialFocus на false в событии LostFocus, но приведенный ниже код активирует изменения ячейки. Знаете ли вы, как я лучше поймаю на место потерянное фокусное мероприятие, и согласны ли вы с тем, что это место, чтобы выключить фиксатор?

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

Другой новый вопрос!

Я нахожу DataGrid в качестве PITA и короткую полезную информацию. Лучшие ссылки (Vin Sibal, Jamie Rodriquez) все очень старые (когда они были частью ToolKit).

Знаете ли вы, что обновленная ссылка действительно хороша?

+0

Вы могли бы, возможно, взглянуть на e.NewFocus, e.OldFocus, e.OriginalSource в DataGridLostFocus и сделать что-то умное с ними. Я боюсь, что мой источник информации о DataGrid, вероятно, такой же, как ваш. MSDN, StackOverflow и много экспериментов. – Phil

ответ

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

Смежные вопросы