我的派生类有两个相关问题。
我正在尝试添加SelectedIndexChanged
事件处理程序。它当然被称为:
class DataGridViewColourComboBoxCell : DataGridViewComboBoxCell
{
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
DataGridViewColourComboBoxEditingControl ctl =
DataGridView.EditingControl as DataGridViewColourComboBoxEditingControl;
// Use the default row value when Value property is null.
if (this.Value == null)
{
ctl.SelectedIndex = (int)this.DefaultNewRowValue;
}
else
{
ctl.SelectedItem = Find(this.Value.ToString());
try
{
ctl.SelectedIndexChanged -= new EventHandler(SelectedIndexChanged);
}
catch { }
ctl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged);
}
}
}
private void SelectedIndexChanged(object sender, EventArgs e)
{
DataGridViewColourComboBoxEditingControl ctl = (DataGridViewColourComboBoxEditingControl)sender;
MessageBox.Show(ctl.SelectedIndex.ToString());
}
但我有两个问题:
我已经修复了第1项。我在错误的地方添加了事件处理程序。我在这里需要它:
public class DataGridViewColourComboBoxEditingControl : DataGridViewComboBoxEditingControl
{
public DataGridViewColourComboBoxEditingControl() : base()
{
DrawMode = DrawMode.OwnerDrawFixed;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
//base.OnDrawItem(e);
//....
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
MessageBox.Show(SelectedIndex.ToString());
base.OnSelectedIndexChanged(e);
}
}
但第2项仍然是一个问题。事件只是单击另一个单元格导致事件触发(请注意,我已将网格设置为单击时编辑)。但是单击单元格无论如何都不会显示下拉列表。在这种情况下,我不希望它发射。它必须来自下拉列表中的选择。
我见过这个:How to handle SelectedIndexChanged event for a ComboBox?
但我不想在网格中做事。我想在派生类中做一些事情。基本上我想检测他们何时显示下拉列表并单击第一项。如果他们点击第一个项目,它应该显示一个表格(表现得像一个按钮)。
更新
我相信我可能找到了解决方案:
public class DataGridViewColourComboBoxEditingControl : DataGridViewComboBoxEditingControl
{
public DataGridViewColourComboBoxEditingControl() : base()
{
DrawMode = DrawMode.OwnerDrawFixed;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
//base.OnDrawItem(e);
//....
}
protected override void OnDropDownClosed(EventArgs e)
{
if(SelectedIndex == 0) // Display the pop up
MessageBox.Show("Display pop up colour dialog");
base.OnDropDownClosed(e);
}
}
我需要使用OnDropDownClosed
。该解决方案的唯一问题是该单元格中已经选择了该条目。由于我希望组合中的第一个项目像按钮一样,因此想法是如果他们选择了它,它会显示一个对话框(他们选择一种不在组合中的不同颜色)并将其添加到组合中并选择它。目前,如果我在处理程序中手动添加SelectedIndex = 5;
(我实际上选择了索引4),它首先闪烁索引4的单元格然后索引5.有意义吗?