SelectedIndexChanged 事件也会因错误的 datagridviewcomboboxcell 而触发
SelectedIndexChanged event also firing for wrong datagridviewcomboboxcell
我有一个 datagridview,其中有 2 个 datagridviewcomboboxcolumns。我通过 editingcontrolshowing 方法设置了 selectedindexchanged 方法(因为这是我读过的应该完成的方式?)
但是,由于某种原因,当第一次更改为第二个组合框时会触发此事件。
我的问题是;是什么导致此方法触发?在分配处理程序之前,我明确检查它是否是第一列,但我仍然需要检查处理程序本身,因为至少有一次列索引为 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";
}
}
这是预料之中的,因为编辑控件类型已缓存,如果类型相同,则会重用该控件。在您的例子中,相同的 ComboBox
控件在 DataGridViewComboBoxColumn
中重复使用。这就是它第二次被解雇的原因 DataGridViewComboBoxColumn
.
查看 ComboBox 控件是否跨列重复使用,还是每列都有自己的 ComboBox 编辑控件? MSDN link 中的问题更多详情。
我有一个 datagridview,其中有 2 个 datagridviewcomboboxcolumns。我通过 editingcontrolshowing 方法设置了 selectedindexchanged 方法(因为这是我读过的应该完成的方式?) 但是,由于某种原因,当第一次更改为第二个组合框时会触发此事件。
我的问题是;是什么导致此方法触发?在分配处理程序之前,我明确检查它是否是第一列,但我仍然需要检查处理程序本身,因为至少有一次列索引为 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";
}
}
这是预料之中的,因为编辑控件类型已缓存,如果类型相同,则会重用该控件。在您的例子中,相同的 ComboBox
控件在 DataGridViewComboBoxColumn
中重复使用。这就是它第二次被解雇的原因 DataGridViewComboBoxColumn
.
查看 ComboBox 控件是否跨列重复使用,还是每列都有自己的 ComboBox 编辑控件? MSDN link 中的问题更多详情。