Запустите ListView.Событие SelectedIndexChanged выбрано программным путем?
-
03-07-2019 - |
Вопрос
Как можно программно запустить событие SelectedIndexChanged ListView?
Я предполагал, что первый элемент в моем ListView будет автоматически выбран после того, как пользователь выполнит определенное действие.В событии SelectedIndexChanged уже существует код для выделения выбранного элемента.Элемент не только не выделяется, но и точка останова, установленная в SelectedIndexChanged, никогда не будет достигнута.Более того, Debug.WriteLine не выдает выходные данные, поэтому я скорее уверен, что событие не сработало.
Следующий код не запускает событие:
listView.Items[0].Selected = false;
listView.Items[0].Selected = true;
listView.Select();
Application.DoEvents();
Дополнительный вызов метода .Select() был включен для пущей убедительности.;) Отмена выбора (.Selected = false) была включена для отмены выбора элемента ListViewItem в .Коллекция элементов на всякий случай, возможно, она была выбрана по умолчанию, и поэтому установка для нее значения "true" не имела бы никакого эффекта.Вызов 'Application.DoEvents()' - это еще один метод последнего отказа.
Разве приведенный выше код не должен вызывать срабатывание события SelectedIndexChanged?
Я должен упомянуть, что событие SelectedIndexChanged срабатывает должным образом, когда элемент выбирается с помощью клавиатуры или мыши.
Решение
Отмена выбора, установив для него значение false, не приведет к запуску события, но установка для него значения true приведет к запуску.
public Form1 ()
{
InitializeComponent();
listView1.Items[0].Selected = false; // Doesn't fire
listView1.Items[0].Selected = true; // Does fire.
}
private void listView1_SelectedIndexChanged (object sender, EventArgs e)
{
// code to run
}
Возможно, у вас происходит что-то еще.В каком событии вы запускаете свой код выбора?
Другие советы
Почему вы не можете переместить код, который в данный момент находится внутри метода вашего обработчика событий, в метод, который может быть вызван из исходного места, а также из вашего кода?
Что - то вроде этого:
class Foo
{
void bar(Object o, EventArgs e)
{
// imagine this is something important
int x = 2;
}
void baz()
{
// you want to call bar() here ideally
}
}
был бы реорганизован в соответствии с этим:
class Foo
{
void bar(Object o, EventArgs e)
{
bop();
}
void baz()
{
bop();
}
void bop()
{
// imagine this is something important
int x = 2;
}
}
Если вы создаете класс, производный от ListView
, вы можете вызвать защищенный метод OnSelectedIndexChanged
.Это приведет к срабатыванию SelectedIndexChanged
событие.