2012-04-23 30 views
5

WPFにはDataGridがあります。WPF DataGridのEnterキーをタブとして使用する

私は私がを入力してLastColumnに達すると、それはデフォルト作成または次の行に移動するの機能を入力しなければならない打ったときNextCellに移動したいです。

私は、私はWPFでこれを行うことができますどのようにタブ

を使用したくありません。

+0

何を試しましたか? 'KeyUp'イベントにアタッチし、' 'を処理するのはかなりシンプルなようです。 – Tejs

+0

しかし、それは動作しません。 –

+0

dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); –

答えて

0

私はそれが少なくとも私のために働いたと思うこれを試してください。

//datagrid gotfocus event 
private void dataGrid1_GotFocus(object sender, RoutedEventArgs e) 
{ 
    DependencyObject dep = (DependencyObject)e.OriginalSource; 
    //here we just find the cell got focused ... 
    //then we can use the cell key down or key up 
    // iteratively traverse the visual tree 
    while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader)) 
    { 
     dep = VisualTreeHelper.GetParent(dep); 
    } 

    if (dep == null) 
     return; 

    if (dep is DataGridCell) 
    { 
     DataGridCell cell = dep as DataGridCell; 
     //raise key down event of cell 
     cell.IsSelected = true; 
     cell.KeyDown += new KeyEventHandler(cell_KeyDown); 
    } 
} 

void cell_KeyDown(object sender, KeyEventArgs e) 
{ 
    DataGridCell cell = sender as DataGridCell; 
    if (e.Key == Key.Enter) 
    { 
     cell.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
     cell.IsSelected = false; 
     e.Handled = true; 
     cell.KeyDown -= cell_KeyDown; 
    } 
} 

このコードでは、セルにフォーカスがあり、その次のセルでユーザーキーがフォーカスされるとフォーカスが得られます。 これはあなたに役立つことを祈っています。

編集:

この機能は、DataGrid PreviewKeyDownイベントとして設定します。

private void maindg_PreviewKeyDown(object sender, KeyEventArgs e) 
     { 

      //just accept enter key 
      if (e.Key != Key.Enter) return; 

     DependencyObject dep = (DependencyObject)e.OriginalSource; 
     //here we just find the cell got focused ... 
     //then we can use the cell key down or key up 
     // iteratively traverse the visual tree 
     while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader)) 
     { 
      dep = VisualTreeHelper.GetParent(dep); 
     } 

     if (dep == null) 
      return; 

     if (dep is DataGridCell) 
     { 
      //cancel if datagrid in edit mode 
      maindg.CancelEdit(); 
      //get current cell 
      DataGridCell cell = dep as DataGridCell; 
      //deselect current cell 
      cell.IsSelected = false; 
      //find next right cell 
      var nextCell = cell.PredictFocus(FocusNavigationDirection.Right); 
      //if next right cell null go for find next ro first cell 
      if (nextCell == null) 
      { 
       DependencyObject nextRowCell; 
       nextRowCell = cell.PredictFocus(FocusNavigationDirection.Down); 
       //if next row is null so we have no more row Return; 
       if (nextRowCell == null) return; 
       //we do this because we cant use FocusNavigationDirection.Next for function PredictFocus 
       //so we have to find it this way 
       while ((nextRowCell as DataGridCell).PredictFocus(FocusNavigationDirection.Left) != null) 
        nextRowCell = (nextRowCell as DataGridCell).PredictFocus(FocusNavigationDirection.Left); 
       //set new cell as next cell 
       nextCell = nextRowCell; 
      } 
      //change current cell 
      maindg.CurrentCell = new DataGridCellInfo(nextCell as DataGridCell); 
      //change selected cell 
      (nextCell as DataGridCell).IsSelected = true; 
      // start edit mode 
      maindg.BeginEdit(); 
     } 
     //handl the default action of keydown 
     e.Handled = true; 
    } 
+0

のフォーカスを得たイベントを設定することを忘れてしまいました。 –

+0

@Mamad R、その働き、次のセルにフォーカスがあるときに、編集可能にする方法があります – Mussammil

+0

@Mussammil My Last Editを読んでください。希望を助けてください:) –

-1

はるかに簡単な実装です。アイデアは、キーダウンイベントをキャプチャし、キーが "Enter"の場合は、グリッドの次のタブである次のタブに移動します。

/// <summary> 
/// On Enter Key, it tabs to into next cell. 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
private void DataGrid_OnPreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    var uiElement = e.OriginalSource as UIElement; 
    if (e.Key == Key.Enter && uiElement != null) 
    { 
     e.Handled = true; 
     uiElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
    } 
} 
関連する問題