2013-03-06 118 views
4

我有一個DataGridView有兩列(DataGridViewTextBoxColumnDataGRidViewComboBoxColumn)。如果我點擊文本框列中的一個單元格並用鼠標滾輪滾動,則網格滾動。太棒了。禁用滾動通過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; 
} 

任何想法如何滾動DataGridView的時候DataGridViewComboBox列是活動的?

回答

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:

如果我單擊組合框列中的單元格,鼠標滾輪將滾動組合框中的項目。

我假設你只是想改變聚焦一旦已經做出選擇。

+0

這使得它可以按照我的需要工作。謝謝。 – Web 2013-03-25 17:17:58

1

您可以使用P/Invoke重定向輸入,如here。或者您可以繼承DataGridView以添加Scroll方法,該方法調用基類的OnMouseWheel方法,然後您可以從DGVCombo_MouseWheel調用該方法。示例here

我覺得第二個選擇可能是最優雅的,沒有理由使用PInvoke。

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(); 
        } 
       }; 
    };