4

DataGridViewTextBoxColumn2つの列(と)を持つDataGridViewがあります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をスクロールする方法はありますか?

4

3 に答える 3

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 がまだドロップダウンされている場合は、別の状況になりますが、ここで言ったことから判断すると、次のようになります。

コンボボックス列のセルをクリックすると、マウスホイールがコンボボックス内の項目をスクロールします。

選択が完了したら、単にフォーカスを変更したいだけだと思います。

于 2013-03-25T17:13:42.147 に答える
1

hereのように P/Invoke を使用して入力をリダイレクトできます。または、 をサブクラス化して、基本クラスのメソッドを呼び出すメソッドをDataGridView追加し、それを から呼び出すこともできます。例はこちらScrollOnMouseWheelDGVCombo_MouseWheel

2 番目のオプションはおそらく最も洗練されていると思いますが、PInvoke を使用する理由はありません。

于 2013-03-06T14:37:51.750 に答える