Dot-Net

DataGridView:如何使輸入鍵添加新行而不是更改目前單元格?

  • January 12, 2019

如何使 Enter 鍵在 Winforms 中的行為DataGridViewTextBoxCell像在普通 Winforms 中一樣TextBox(在文本中添加新行,而不是更改目前單元格)?

好吧,我找到了解決問題的方法。首先,創建一個CustomDataGridViewTextBoxEditingControl派生自的類DataGridViewTextBoxEditingControl,並像這樣覆蓋EditingControlWantsInputKey

public class CustomDataGridViewTextBoxEditingControl : DataGridViewTextBoxEditingControl
   {
       public override bool EditingControlWantsInputKey(
       Keys keyData, 
       bool dataGridViewWantsInputKey)
       {
           switch (keyData & Keys.KeyCode)
           {
               case Keys.Enter:
                   // Don't let the DataGridView handle the Enter key.
                   return true;
               default:
                   break;
           }

           return base.EditingControlWantsInputKey(keyData, dataGridViewWantsInputKey);
   }
}

這將阻止DataGridView傳遞 Enter 鍵並更改目前單元格。但是,它不會使 Enter 鍵添加新行。(似乎DataGridViewTextBoxEditingControl已經刪除了 Enter 鍵的功能)。因此,我們需要自己重寫OnKeyDown和實現該功能,如下所示:

protected override void OnKeyDown(KeyEventArgs e)
{
   switch (e.KeyCode & Keys.KeyCode)
   {
       case Keys.Enter:
           int oldSelectionStart = this.SelectionStart;
           string currentText = this.Text;

           this.Text = String.Format("{0}{1}{2}",
               currentText.Substring(0, this.SelectionStart),
               Environment.NewLine,
               currentText.Substring(this.SelectionStart + this.SelectionLength));

           this.SelectionStart = oldSelectionStart + Environment.NewLine.Length;
           break;
       default:
           break;
   }

   base.OnKeyDown(e);
}

然後,創建一個CustomDataGridViewTextBoxCell派生自的類DataGridViewTextBoxCell,並重寫該EditType屬性以返回 的類型CustomDataGridViewTextBoxEditingControl

public class CustomDataGridViewTextBoxCell : DataGridViewTextBoxCell
{
   public override Type EditType
   {
       get
       {
           return typeof(CustomDataGridViewTextBoxEditingControl);
       }
   }
}

完成此操作後,您可以將CellTemplate現有列上的屬性設置為 a CustomDataGridViewTextBoxCell,或者您可以創建一個派生自預設為 a的類DataGridViewColumn,一切就緒!CellTemplate``CustomDataGridViewTextBoxCell

引用自:https://stackoverflow.com/questions/2030542