2016-07-25 24 views
0

今天,我遇到了一個DataGridView以下要求:如何在DataGridView的一列單元格之間標籤

想象你有一個包含了僅供參考(不可編輯)值多列一個DataGridView。 您可能只想在可編輯列之間切換。 在我的要求我有一個DataGridView與3個不可編輯的文本列一個可編輯的DataGridViewComboBoxColumn。 它只需要在DataGridViewComboBoxCells之間選中。

+0

改爲使用Enter鍵。通過按Enter鍵選擇列中的下一個單元格(下圖)。 –

+0

我也許知道,但這個要求來自用戶。此外,您不能使用Shift + Enter轉到上一行。 – kami

回答

0

我想出了下面我想分享的解決方案。

/// <summary> 
/// Overrided method to tab only in a DataGridComboBox column. 
/// </summary> 
/// <param name="msg">A Message, passed by reference, that represents the window message to process.</param> 
/// <param name="keyData">One of the Keys values that represents the key to process.</param> 
/// <returns>True if the character was processed by the control. Otherwise, False.</returns> 
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    bool TabIsPressed = ((keyData == Keys.Tab) || (keyData == (Keys.Shift | Keys.Tab))); // Checks if Tab or Shift/Tab is pressed. 
    Control CurrentControl = this.ActiveControl; // Gets the currently focused control. 
    bool IsDataGridViewControl = (CurrentControl.GetType() == typeof(DataGridView)); // Checks if the currently focused control is a DataGridView control. 
    bool IsComboBoxEditingControl = (CurrentControl.GetType() == typeof(DataGridViewComboBoxEditingControl)); // Checks if the currently focused control is a DataGridViewComboBoxEditingControl control. 
    bool DataGridViewIsValid = (IsDataGridViewControl && dataGridViewDMSSettings.Rows.Count > -1); // Checks if a DataGridView control is focused is not empty. 
    if 
    (
     TabIsPressed // If a Tab key is pressed. 
     && (
      DataGridViewIsValid // And a DataGridView is focused and valid. 
      || IsComboBoxEditingControl // Or a DataGridViewComboBoxEditingControl is focused. 
     ) 
    ) 
    { 
     int CurrentRowIndex = dataGridViewDMSSettings.CurrentCell.RowIndex; // Gets the current rows index. 
     int LastRowIndex = dataGridViewDMSSettings.RowCount - 1; // Gets the last rows index. 
     if (IsComboBoxEditingControl) // If a DataGridViewComboBoxEditingControl is focused. 
     { 
      ((DataGridViewComboBoxEditingControl)CurrentControl).EditingControlDataGridView.EndEdit(); // Ends the editing mode for the control. 
     } 
     int NextRowIndex = CurrentRowIndex; // Creates a variable for the next rows index. 
     switch (keyData) // Switches through the pressed keys. 
     { 
      case (Keys.Tab): // If the Tab key is pressed. 
       if (IsComboBoxEditingControl) // If a DataGridViewComboBoxEditingControl is focused. 
       { 
        NextRowIndex++; // Sets the next row index to the next row. 
        if (NextRowIndex > LastRowIndex) // If next row index is greater than the last row index. 
        { 
         NextRowIndex = 0; // Focuses the first row. (Alternatively call "base.ProcessCmdKey(ref msg, keyData)" to exit the DataGridView) 
        } 
       } 
       break; 
      case (Keys.Shift | Keys.Tab): // If Shift and Tab key is pressed. 
       NextRowIndex--; // Sets the next row index to the previous row. 
       if (NextRowIndex < 0) // If previous row index is smaller than the first row index. 
       { 
        NextRowIndex = LastRowIndex; // Focuses the last row. (Alternatively call "base.ProcessCmdKey(ref msg, keyData)" to exit the DataGridView) 
       } 
       break; 
     } 
     dataGridViewDMSSettings.CurrentCell = dataGridViewDMSSettings.Rows[NextRowIndex].Cells["DMSIndex"]; // Sets the focus on the next DataGridViewComboBox. 
     this.Refresh(); // Rerenders the current form. 
     return true; // Returns true to the caller. 
    } 
    else // If another key (Not a Tab key) is pressed or the currently focused control is not a DataGridView or DataGridViewComboBoxEditing control. 
    { 
     return base.ProcessCmdKey(ref msg, keyData); // Performs the standard ProcessCmdKey method. 
    } 
} 

該解決方案唯一的小問題是退出DataGridComboBoxCell visualy呈現慢一點點(你可以看到它變白短短的一秒鐘)我已經儘量減少與效果:

this.Refresh(); 

但它並沒有消失。 P.S.啓用表單雙緩衝區並沒有改變這種效果。

也許有人可以改進我的方法來解決這最後一個問題。

相關問題