禁用在DataGridViewComboBoxColumn中滚动和在datagridview中滚动
本文关键字:滚动 datagridview DataGridViewComboBoxColumn | 更新日期: 2023-09-27 18:02:28
我有一个包含两列(DataGridViewTextBoxColumn
和DataGRidViewComboBoxColumn
(的DataGridView。如果我点击文本框列中的一个单元格并用鼠标滚轮滚动,网格就会滚动。这太完美了。
如果我单击组合框列中的单元格,鼠标滚轮将滚动组合框中的项目。我需要滚动数据网格视图。
在我尝试修复的过程中,我可以通过处理EditingControlShowing
事件来禁用组合框中的滚动:
private void SeismicDateGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is IDataGridViewEditingControl)
{
dgvCombo = (IDataGridViewEditingControl) e.Control;
((System.Windows.Forms.ComboBox)dgvCombo).MouseWheel -= new MouseEventHandler(DGVCombo_MouseWheel);
((System.Windows.Forms.ComboBox)dgvCombo).MouseWheel += new MouseEventHandler(DGVCombo_MouseWheel);
}
}
private void DGVCombo_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
HandledMouseEventArgs mwe = (HandledMouseEventArgs)e;
mwe.Handled = true;
}
有什么想法可以在DataGridViewComboBox
列处于活动状态时滚动DataGridView吗?
您是否考虑过处理ComboBox的DropDownClosed事件并将焦点更改为父级?
void DateGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
System.Windows.Forms.ComboBox comboBox = dataGridView.EditingControl as System.Windows.Forms.ComboBox;
if (comboBox != null)
{
comboBox.DropDownClosed += comboBox_DropDownClosed;
}
}
void comboBox_DropDownClosed(object sender, EventArgs e)
{
(sender as System.Windows.Forms.ComboBox).DropDownClosed -= comboBox_DropDownClosed;
(sender as System.Windows.Forms.ComboBox).Parent.Focus();
}
如果你想在选择单元格之前滚动DataGridView,但ComboBox仍然下拉,那将是一种不同的情况,但根据你在这里所说的判断:
如果我单击组合框列中的单元格,鼠标滚轮将滚动组合框中的项目。
我假设你只是想在做出选择后改变焦点。
您可以像这里一样使用p/Invoke重定向输入。或者,您可以对DataGridView
进行子类化,为其添加一个Scroll
方法,该方法调用基类的OnMouseWheel
方法,然后您可以从DGVCombo_MouseWheel
调用该方法。此处为示例。
我认为第二种选择可能是最优雅的,没有理由使用PInvoke。
这里是用内联函数完成的。和处理的情况,当组合框被放下:
dgv.EditingControlShowing += (s, e) =>
{
DataGridViewComboBoxEditingControl editingControl = e.Control as DataGridViewComboBoxEditingControl;
if (editingControl != null)
editingControl.MouseWheel += (s2, e2) =>
{
if (!editingControl.DroppedDown)
{
((HandledMouseEventArgs)e2).Handled = true;
dgv.Focus();
}
};
};