2011-01-05 127 views
1

我有一个DataGrid与几个可编辑的单元格。用户可以通过每个单元格标签来编辑内容。现在我想实现与标签一样工作的右箭头键。因此,当用户完成编辑一个单元格并按下右箭头键时,焦点将移至下一个可编辑单元格并开始编辑。如何实现WPF Datagrid箭头键导航像Tab导航

例如,我有如下画面:

当用户按下右箭头键,我想我的DataGrid是这样的:

回答

1

数据网格实际上汽车 - 右,左,上,下方向键。话虽如此,您可以使用任何键移动单元格焦点,然后开始键入以进入编辑模式(如果单元格可编辑)。您不必听重点按下事件。请注意,如果您点击“Enter”,那么您将移动到下一行。

编辑:

当然,在默认情况下箭头键不会把一个细胞进入编辑模式。相反,你必须输入东西或使用鼠标指针。但是,你可以做到以下几点:

private void myDataGrid_CurrentCellChanged(object sender, EventArgs e) 
    { 
     myDataGrid.BeginEdit(); 
    } 

这将迫使焦点的单元格进入编辑模式。我尝试过使用按键事件处理程序,但似乎DataGrid不会让用户听到箭头键和Enter(尽管你可以使用WIN32 API)。现在,无论何时使用任何箭头键,新选中的单元格都将处于编辑模式。尝试点击Esc退出此模式。

+0

感谢您的答复。我的数据网格正如你现在所说的那样工作。但是,我想让我的datagrid单元格在焦点时直接进入编辑模式。谢谢 – Jing 2011-01-05 03:56:25

+0

我刚刚编辑了我的答案。 HTH! – user1234567 2011-01-05 04:04:00

+0

再次感谢您的回复。现在,我的datagrid单元格直接进入编辑模式。但是当我完成一个单元格的编辑并按下右箭头键时,它仍然保留在同一单元格中,而不会转到下一个可编辑单元格。你能给我一些关于这个的想法吗?谢谢 – Jing 2011-01-05 04:11:29

0

这是我使用箭头键

其放置在Datagrid_KeyUp事件内

DataGridCell DGcell = new DataGridCell(); 
    DGcell = GetCell(index, _Header); 
    if (DGcell != null) 
    { 
     CurrentCellContentType = DGcell.Content.GetType().Name.ToString(); 
    } 
    DataGridCell ProdCodeCell = GetCell(index, 0); 
    DataGridCell DescCell = GetCell(index, 1); 
    DataGridCell CostPriceCell = GetCell(index, 4); 
    DataGridCell VatRateCell = GetCell(index, 9); 

    DataGridCellInfo PCell = new DataGridCellInfo(ProdCodeCell); 
    DataGridCellInfo DCell = new DataGridCellInfo(DescCell); 
    DataGridCellInfo PriceCell = new DataGridCellInfo(CostPriceCell); 
    DataGridCellInfo VatCell = new DataGridCellInfo(VatRateCell); 

    string ProdCellContentType = PCell.Column.GetCellContent(PCell.Item).GetType().Name.ToString(); 
    string DescCellContentType = DCell.Column.GetCellContent(DCell.Item).GetType().Name.ToString(); 
    string PriceCellContentType = PriceCell.Column.GetCellContent(PriceCell.Item).GetType().Name.ToString(); 
    string VatCellContentType = VatCell.Column.GetCellContent(VatCell.Item).GetType().Name.ToString(); 

    switch (e.Key) 
    { 
    case Key.Left: 
     if (CurrentCellContentType == "TextBlock") e.Handled = false; 
     else if (CurrentCellContentType == "TextBox") 
     { 
      DataGridCellInfo cellLeft = new DataGridCellInfo(GetCell(index, _Header - 1)); 
      DgInvoiceLines.CurrentCell = cellLeft; 
     } 
     break; 
    case Key.Right: 
     if (CurrentCellContentType == "TextBlock") else e.Handled = false; 

     else if (CurrentCellContentType == "TextBox") 
     { 
      DataGridCellInfo cellRight = new DataGridCellInfo(GetCell(index, _Header + 1)); 
      DgInvoiceLines.CurrentCell = cellRight; 
     } 
     break; 
    case Key.Up: 
     if (index != 0) 
     { 
      if (CurrentCellContentType == "TextBlock") e.Handled = false; 
      else if (CurrentCellContentType == "TextBox") 
      { 
       DataGridCellInfo cellUp = new DataGridCellInfo(GetCell(index - 1, _Header)); 
       DgInvoiceLines.CurrentCell = cellUp; 
       DgInvoiceLines.SelectedItem = DgInvoiceLines.Items[index - 1]; 
      } 
     } 
     break; 

    case Key.Down: 
     if (CurrentCellContentType == "TextBlock") e.Handled = false; 
     else if (CurrentCellContentType == "TextBox") 
     { 
      DataGridCellInfo cellDown = new DataGridCellInfo(GetCell(index + 1, _Header)); 
      DgInvoiceLines.CurrentCell = cellDown; 
      DgInvoiceLines.SelectedItem = DgInvoiceLines.Items[index + 1]; 
     } 
     break; 

我使用switch语句的数目分配给每个列标题

用于导航的代码HTH。

0

这是我的解决方案,它的工作原理。

在构造函数中:

dataGridSubmissionData.KeyUp += DataGridSubmissionDataOnKeyUp; 
      dataGridSubmissionData.BeginningEdit += DataGridSubmissionDataOnBeginningEdit; 
      dataGridSubmissionData.CellEditEnding += DataGridSubmissionDataOnCellEditEnding; 
      dataGridSubmissionData.CurrentCellChanged += DataGridSubmissionDataOnCurrentCellChanged; 

在体类:

private bool isCellInEditionMode = false; 

private void DataGridSubmissionDataOnCurrentCellChanged(object sender, EventArgs eventArgs) 
     { 
      dataGridSubmissionData.BeginEdit(); 
     } 

     private void DataGridSubmissionDataOnCellEditEnding(object sender, DataGridCellEditEndingEventArgs dataGridCellEditEndingEventArgs) 
     { 
      isCellInEditionMode = false; 
     } 

     private void DataGridSubmissionDataOnBeginningEdit(object sender, DataGridBeginningEditEventArgs dataGridBeginningEditEventArgs) 
     { 
      isCellInEditionMode = true; 
     } 

private void DataGridSubmissionDataOnKeyUp(object sender, KeyEventArgs keyEventArgs) 
     { 
      if (keyEventArgs.Key == Key.Up || keyEventArgs.Key == Key.Down || keyEventArgs.Key == Key.Left || keyEventArgs.Key == Key.Right) 
      { 
       if (!isCellInEditionMode) 
        return; 

       dataGridSubmissionData.CommitEdit(); 

       var key = keyEventArgs.Key; // Key to send 
       var target = dataGridSubmissionData; // Target element 
       var routedEvent = Keyboard.KeyDownEvent; // Event to send 

       target.RaiseEvent(
        new KeyEventArgs(
         Keyboard.PrimaryDevice, 
         PresentationSource.FromVisual(target), 
         0, 
         key) {RoutedEvent = routedEvent} 
        ); 
      } 
     } 

我希望我的回答可以帮助的人。

0

如果你的情况是WPF 托管窗口,它叫无模WPF

而且解决方案可能是这样的:

Window window = new Window(); 
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window); 
window.Show(); 

我见过的解决方案here