我有一个包含两列(DataGridViewTextBoxColumn
和DataGRidViewComboBoxColumn
)的DataGridView。如果单击文本框列中的单元格并使用鼠标滚动滚动,则网格会滚动。太棒了。
如果单击组合框列中的单元格,鼠标滚轮将滚动组合框中的项目。我需要滚动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的任何想法?
答案 0 :(得分:2)
您是否考虑过处理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仍然被删除时,那将是一个不同的情况,但是根据你在这里所说的来判断:
如果我点击组合框列中的单元格,鼠标滚轮就会出现 滚动组合框中的项目。
我假设您只想在选择完成后更改焦点。
答案 1 :(得分:1)
您可以使用P {Invoke重定向输入,例如here。或者您可以继承DataGridView
以向其添加Scroll
方法,该方法调用基类的OnMouseWheel
方法,然后您可以从DGVCombo_MouseWheel
调用该方法。示例here。
我认为第二个选项可能是最优雅的,没有理由使用PInvoke。
答案 2 :(得分:1)
这里使用内联函数完成。并且在处理案例时,组合框被删除:
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();
}
};
};