У меня есть две связанные проблемы с моим производным классом.
Я пытаюсь добавить обработчик событий 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, затем 2, затем 3 и так далее). Я думал, что использование блока try/catch предотвратит это.
Я исправил пункт 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 все еще остается проблемой. Событие просто щелкает другую ячейку, вызывая срабатывание события (обратите внимание, что я настроил свою сетку на редактирование при нажатии). Но один щелчок по ячейке все равно не покажет раскрывающийся список. Я не хочу, чтобы он срабатывал в этом контексте. Это должно быть результатом выбора из выпадающего списка.
Я видел это: Как обрабатывать событие SelectedIndexChanged для 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. Имеет смысл?
SelectedIndexChanged
будет срабатывать в следующих случаях: после того, как вы выбрали индекс изменения поля со списком в текущей ячейке. Также, когда вы начинаете редактировать другую ячейку, значение которой отличается от предыдущей ячейки (хотя в зависимости от вашей реализации она может срабатывать все время, когда вы начинаете редактировать другую ячейку). - person Reza Aghaei   schedule 13.06.2016SelectionChangeCommitted
был правильным. Он стреляет только из дроплиста. - person Andrew Truckle   schedule 13.06.2016