2012-03-03 22 views
0

以下のDataGridが最初にフォーカスを取得したとき(つまり、他のコントロールがフォーカスを当てた後)、最後の行、2列目がフォーカスされ、編集されます。DataGridプログラムによって最後のセルを選択

enter image description here

私はDataGrid.GotFocusのハンドラを追加しましたが、それは複雑なコードだと上記の結果を得ていません。

誰もがエレガントで弾丸で保護されたソリューションを手に入れましたか?

乾杯、
Berryl

EDITS

私は、送信者は、常に私が欲しいグリッドでなければなりませんコード

  1. に小さな変更を加えたので、私はちょうどの代わりに頼っていることを使用しました名前
  2. SelectionUnitがFullRowのとき、グリッドがCellOrRowHeaderに変更される前に、 ap parentlyは私がしたいプライベート無効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; 
    

    }

新しい質問

)(

をSelectedCells.Clearを呼び出すことはできませんフォーカスがウィンドウ内の別のコントロールに移動してからグリッドに戻るときに、選択を繰り返します。 私は、_hasHadInitialFocusラッチをLostFocusイベントでfalseにすることができたと考えましたが、以下のコードはセルの変更で発生しています。 紛失したフォーカスイベントをトラップする方法を知っていますか?また、ラッチをオフにする場所に同意しますか?

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

もう1つ新しい質問!

DataGridがPITAであり、有用な情報が不足しています。最良のリンク(Vin Sibal、Jamie Rodriquez)はすべて(ToolKitの一部である)本当に古いです。

本当に良い更新された参照がありますか?

+0

あなたはおそらくDataGridLostFocusにe.NewFocus、e.OldFocus、e.OriginalSourceを見て、それらとの巧妙な何かを行うことができます。私は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; 
     } 
    } 

グリッドをクリックすると、選択された1つのセルと編集モードのターゲットセルが残ります。必要に応じてこれを解決するには、次のとおりです。

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

グレートコード - 私の編集したポストをいくつかのコメントとフォローアップの質問または3つの - を参照してください。乾杯 – Berryl

関連する問題