2011-01-05 199 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