将焦点移动到输入键上的下一个单元格按WPF DataGrid?

Kis*_*mar 15 c# wpf mvvm wpfdatagrid

我想要一个可以的Custom DataGrid,

  1. Enter如果处于编辑模式,也会在按下键时移动到下一个单元格.
  2. 当达到当前行中的最后一列时,焦点应移动到下一行的第一个单元格.
  3. 在到达下一个单元格时,如果单元格是可编辑的,它应该自动变为可编辑.
  4. 如果单元格包含ComboBox非组合框,则组合框应该是DropDownOpen.

请帮帮我.我在过去的几天里一直在尝试创建一个Custom DataGrid并编写了一些代码

protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
Run Code Online (Sandbox Code Playgroud)

但我失败了.

Hun*_*ter 11

一个更简单的实现.想法是捕获keydown事件,如果键是"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));
    }
}
Run Code Online (Sandbox Code Playgroud)


Nad*_*eem 7

private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
    try
    {
        if (e.Key == Key.Enter)
        {
            e.Handled = true;
            var cell = GetCell(dgIssuance, dgIssuance.Items.Count - 1, 2);
            if (cell != null)
            {
                cell.IsSelected = true;
                cell.Focus();
                dg.BeginEdit();
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox(ex.Message, "Error", MessageType.Error);
    }
}  

public static DataGridCell GetCell(DataGrid dg, int row, int column)
{
    var rowContainer = GetRow(dg, row);

    if (rowContainer != null)
    {
        var presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
        if (presenter != null)
        {
            // try to get the cell but it may possibly be virtualized
            var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            if (cell == null)
            {
                // now try to bring into view and retreive the cell
                dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            }
            return cell;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

  • 很高兴看到缺少代码:`GetRow()`,`GetVisualChild <T>()`什么是`dgIssuance`? (18认同)

小智 6

这个解决方案怎么样?Enter通过设置取消该键的动作Handled=true并按下该Tab键。

public Constructor()
{
  InitializeComponent(); 
  this.SampleDataGrid.PreviewKeyDown += MoveCellOnEnterKey;
}

private void MoveCellOnEnterKey(object sender, KeyEventArgs e)
{
  if(e.Key == Key.Enter)
  {
    // Cancel [Enter] key event.
    e.Handled = true;
    // Press [Tab] key programatically.
    var tabKeyEvent = new KeyEventArgs(
      e.KeyboardDevice, e.InputSource, e.Timestamp, Key.Tab);
    tabKeyEvent.RoutedEvent = Keyboard.KeyDownEvent;
    InputManager.Current.ProcessInput(tabKeyEvent);
  }
}
Run Code Online (Sandbox Code Playgroud)