如何让DataGridViewcombobox一键显示下拉列表?

在我将“EditOnEnter”设置为true后,如果我没有单击combobox的向下箭头部分, DataGridViewComboBoxCell仍然会打开两次。

任何人都有任何线索如何解决这个问题? 我有自己的DataGridView类,所以我可以通过一些智能事件处理程序在系统范围内轻松解决这个问题。

谢谢。

由于您已将DataGridViewEditMode属性设置为“EditOnEnter”,因此您可以覆盖其OnEditingControlShowing方法,以确保在combobox获得焦点时立即显示下拉列表:

 public class myDataGridView : DataGridView { protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e) { base.OnEditingControlShowing(e); if (e.Control is ComboBox) { SendKeys.Send("{F4}"); } } } 

每当DataGridView控件中的编辑控件获得输入焦点时,上面的代码都会检查它是否是一个combobox。 如果是这样,它实际上“按下” F4键,这会导致下拉部分扩展(当任何combobox具有焦点时尝试它!)。 这有点像黑客,但它就像一个魅力。

我使用这个解决方案,因为它避免发送击键:

重写OnCellClick方法(如果您是子类)或订阅CellClick事件(如果您正在从另一个对象而不是子类改变DGV)。

 protected override void OnCellClick(DataGridViewCellEventArgs e) { // Normally the user would need to click a combo box cell once to // activate it and then again to drop the list down--this is annoying for // our purposes so let the user activate the drop-down with a single click. if (e.ColumnIndex == this.Columns["YourDropDownColumnName"].Index && e.RowIndex >= 0 && e.RowIndex <= this.Rows.Count) { this.CurrentCell = this[e.ColumnIndex, e.RowIndex]; this.BeginEdit(false); ComboBox comboBox = this.EditingControl as ComboBox; if (comboBox != null) { comboBox.DroppedDown = true; } } base.OnCellContentClick(e); } 
  protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e) { base.OnEditingControlShowing(e); DataGridViewComboBoxEditingControl dataGridViewComboBoxEditingControl = e.Control as DataGridViewComboBoxEditingControl; if (dataGridViewComboBoxEditingControl != null) { dataGridViewComboBoxEditingControl.GotFocus += this.DataGridViewComboBoxEditingControl_GotFocus; dataGridViewComboBoxEditingControl.Disposed += this.DataGridViewComboBoxEditingControl_Disposed; } } private void DataGridViewComboBoxEditingControl_GotFocus(object sender, EventArgs e) { ComboBox comboBox = sender as ComboBox; if (comboBox != null) { if (!comboBox.DroppedDown) { comboBox.DroppedDown = true; } } } private void DataGridViewComboBoxEditingControl_Disposed(object sender, EventArgs e) { Control control = sender as Control; if (control != null) { control.GotFocus -= this.DataGridViewComboBoxEditingControl_GotFocus; control.Disposed -= this.DataGridViewComboBoxEditingControl_Disposed; } } 

请参阅: Windows窗体上的DataGridView行内的VB.NET控件

要避免SendKeys问题, 请单击一次打开下拉列表(在数据网格视图中)项目中的解决方案。 实质上,在OnEditingControlShowing挂钩到combobox的Enter事件时,在Enter事件处理程序中,设置ComboBox.DroppedDown = true。 这似乎有相同的效果,但没有副作用@Cody Gray提到。