Причина
HandleCreated
повышается только один раз.проблема заключается в другом, это связано с тем, что OnHandleCreated
и привязка данных реализованы в ComboBox
.
Вот как OnHandleCreated
методComboBox
работает:
- Это сначала вызывает
HandleCreated
событие.(Имейте в виду, на данном этапе IsHandleCreated
верно.) - Затем для каждого элемента в
Items
коллекции элемента управления отправляется CB_ADDSTRING
собственное сообщение для добавленияпункт в родной поле со списком.
Вот как работает установка DataSource
:
- Для каждого элемента в
DataSource
сначала добавляет элемент к Items
collection, затем проверяет, является ли IsHandleCreated
истиной, отправляет CB_ADDSTRING
собственное сообщение, чтобы добавить элемент в собственное поле со списком.
Поэтому, когда вы устанавливаете DataSource
в событии HandleCreated
, для каждого элемента он отправляет CB_ADDSTRING
собственное сообщение дважды.
Поэтому в раскрывающемся списке вы дважды видите элементы, и в то же время Items.Count
показывает правильное количество.Также, если вы щелкнете по дополнительному элементу (последняя половина элементов), вы получите индекс исключения из диапазона.
Решение
Чтобы решить проблему, вы можете воспользоваться одним из следующихoptoins:
Вы можете отложить выполнение кода события HandleCreated
, используя BeginInvoke
В качестве другого варианта, на который можно положиться VisibleChanged
событие.
Опция 1 - HandleCreated + BeginInvoke
var mylist = Enumerable.Range(1, 5).ToList();
var myvalue = 2;
var cbo = new ComboBox();
cbo.HandleCreated += (obj, args) =>
{
BeginInvoke(new Action(() =>
{
cbo.DataSource = mylist;
cbo.SelectedIndex = mylist.IndexOf(myvalue);
}));
};
this.Controls.Add(cbo);
Опция 2 - VisibleChanged
var mylist = Enumerable.Range(1, 5).ToList();
var myvalue = 2;
var cbo = new ComboBox();
cbo.VisibleChanged+= (obj, args) =>
{
cbo.DataSource = mylist;
cbo.SelectedIndex = mylist.IndexOf(myvalue);
};
this.Controls.Add(cbo);