C# SelectedIndexChanged事件也为错误的DataGridViewComboxCell触发

C# SelectedIndexChanged事件也为错误的DataGridViewComboxCell触发,c#,datagridview,selectedindexchanged,datagridviewcomboboxcell,C#,Datagridview,Selectedindexchanged,Datagridviewcomboboxcell,我有一个datagridview,其中有两列datagridviewcomboboxcolumns。我通过editingcontrolshowing方法设置selectedindexchanged方法(因为这是我读过的应该如何完成的?) 但是,由于某些原因,此事件在第一次更改为第二个组合框时激发 我的问题是,;是什么导致此方法引发火灾?在分配处理程序之前,我显式地检查它是否是第一列,但我仍然需要检查处理程序本身,因为至少有一次columnindex是1 任何帮助都将不胜感激。如果我有什么不清楚的

我有一个datagridview,其中有两列datagridviewcomboboxcolumns。我通过editingcontrolshowing方法设置selectedindexchanged方法(因为这是我读过的应该如何完成的?) 但是,由于某些原因,此事件在第一次更改为第二个组合框时激发

我的问题是,;是什么导致此方法引发火灾?在分配处理程序之前,我显式地检查它是否是第一列,但我仍然需要检查处理程序本身,因为至少有一次columnindex是1

任何帮助都将不胜感激。如果我有什么不清楚的地方,请告诉我

private void AddLicenses_Load(object sender, EventArgs e)
{
    this._data = this.GetData();

    DataGridViewComboBoxColumn productColumn = new DataGridViewComboBoxColumn();
    productColumn.DataPropertyName = "Name";
    productColumn.HeaderText = "Product";
    productColumn.Width = 120;
    productColumn.DataSource = this._data.Select(p => p.Name).Distinct().ToList();
    this.licenses.Columns.Add(productColumn);

    DataGridViewComboBoxColumn distributorColumn = new DataGridViewComboBoxColumn();
    distributorColumn.DataPropertyName = "Distributor";
    distributorColumn.HeaderText = "Distributor";
    distributorColumn.Width = 120;
    this.licenses.Columns.Add(distributorColumn);
}

private void licenses_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox productDropDown = (ComboBox)e.Control;

    if (productDropDown != null && this.licenses.CurrentCell.ColumnIndex == 0)
    {
        productDropDown.SelectedIndexChanged -= productDropDown_SelectedIndexChanged;
        productDropDown.SelectedIndexChanged += productDropDown_SelectedIndexChanged;
    }
}

private void productDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
    if (this.licenses.CurrentCell.ColumnIndex == 0)
    {
        ComboBox productDropDown = (ComboBox)sender;

        DataGridViewComboBoxCell distributorCell = (DataGridViewComboBoxCell)this.licenses.CurrentRow.Cells[1];
        distributorCell.Value = null;
        distributorCell.DataSource = this._data.Where(p => p.Name == (string)productDropDown.SelectedValue).OrderBy(p => p.UnitPrice).Select(d => new EnLicense() { Distributor = d.Distributor, UnitPrice = d.UnitPrice }).ToList();
        distributorCell.ValueMember = "Distributor";
        distributorCell.DisplayMember = "DistributorDisplay";
    }
}

这是预期的,因为编辑控件类型被缓存,如果类型相同,则重用该控件。在您的示例中,相同的
组合框
控件在
DataGridViewComboBoxColumn
中重复使用。这就是为什么会为第二个
DataGridViewComboBoxColumn
激发它

请参见ComboBox控件是否跨列重用,或者每列是否都有自己的ComboBox编辑控件?有关详细信息,请访问此链接中的问题