「EditOnEnter」をtrueに設定した後もDataGridViewComboBoxCell
、コンボボックスの下矢印部分をクリックしないと、2回クリックして開くことができます。
誰かがこれを修正する方法の手がかりを持っていますか?使用する独自のDataGridView
クラスがあるので、システム全体でこの問題を簡単に修正できます。いくつかのスマートイベントハンドラーを使用できます。
ありがとう。
「EditOnEnter」をtrueに設定した後もDataGridViewComboBoxCell
、コンボボックスの下矢印部分をクリックしないと、2回クリックして開くことができます。
誰かがこれを修正する方法の手がかりを持っていますか?使用する独自のDataGridView
クラスがあるので、システム全体でこの問題を簡単に修正できます。いくつかのスマートイベントハンドラーを使用できます。
ありがとう。
DataGridView
のプロパティはすでにEditMode
「EditOnEnter」に設定されているので、そのOnEditingControlShowing
メソッドをオーバーライドするだけで、コンボボックスがフォーカスを受け取るとすぐにドロップダウンリストが表示されるようになります。
public class myDataGridView : DataGridView
{
protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e)
{
base.OnEditingControlShowing(e);
if (e.Control is ComboBox) {
SendKeys.Send("{F4}");
}
}
}
コントロールの編集コントロールDataGridView
が入力フォーカスを取得するたびに、上記のコードはそれがコンボボックスであるかどうかを確認します。もしそうなら、それは事実上F4キーを「押す」ので、ドロップダウン部分が拡張されます(コンボボックスにフォーカスがあるときに試してみてください!)。ちょっとしたハックですが、魅力のように機能します。
キーストロークの送信を回避するため、このソリューションを使用しました。
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;
}
}
SendKeysの問題を回避するには、シングルクリックで[開く]ドロップダウン(データグリッドビュー内)の項目から解決策を試してください。基本的に、コンボボックスのEnterイベントへのOnEditingControlShowingフックで、Enterイベントハンドラーで、ComboBox.DroppedDown=trueを設定します。それは同じ効果があるようですが、@CodyGrayが言及する副作用はありません。