WPFにはDataGrid
があります。WPF DataGridのEnterキーをタブとして使用する
私は私ががを入力してLastColumnに達すると、それはデフォルト作成または次の行に移動するの機能を入力しなければならない打ったときNextCellに移動したいです。
私は、私はWPFでこれを行うことができますどのようにタブ
を使用したくありません。
WPFにはDataGrid
があります。WPF DataGridのEnterキーをタブとして使用する
私は私ががを入力してLastColumnに達すると、それはデフォルト作成または次の行に移動するの機能を入力しなければならない打ったときNextCellに移動したいです。
私は、私はWPFでこれを行うことができますどのようにタブ
を使用したくありません。
私はそれが少なくとも私のために働いたと思うこれを試してください。
//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;
}
のフォーカスを得たイベントを設定することを忘れてしまいました。 –
@Mamad R、その働き、次のセルにフォーカスがあるときに、編集可能にする方法があります – Mussammil
@Mussammil My Last Editを読んでください。希望を助けてください:) –
はるかに簡単な実装です。アイデアは、キーダウンイベントをキャプチャし、キーが "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));
}
}
何を試しましたか? 'KeyUp'イベントにアタッチし、' 'を処理するのはかなりシンプルなようです。 –
Tejs
しかし、それは動作しません。 –
dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); –