Для ListBox (с режимом выбора, установленным на One), я хочу отслеживать, есть ли выбранный элемент или ни один не выбран. Для этого я подписал метод на SelectedIndexChanged и проверил, равен ли SelectedIndex -1 или нет. Однако я заметил, что событие не вызывается после вызова Items.Clear (), даже если SelectedIndex изменяется на -1 (если это не было уже -1).
Почему не срабатывает?
Я знаю, что могу обойти это, назначив -1 для SelectedIndex перед очисткой списка. Но есть ли лучший способ?
Вот простой код для репликации этого:
using System;
using System.Windows.Forms;
namespace ns
{
class Program
{
static ListBox lst = new ListBox();
public static void Main()
{
lst.SelectedIndexChanged += new EventHandler(lst_SelectedIndexChanged);
lst.Items.Add(1);
Console.WriteLine("Setting selected index to 0...");
lst.SelectedIndex = 0; //event fire here
Console.WriteLine("(Selected Index == {0})", lst.SelectedIndex);
Console.WriteLine("Clearing all items...");
lst.Items.Clear(); //event *should* fire here?!
//proof that the selected index has changed
Console.WriteLine("(Selected Index == {0})", lst.SelectedIndex);
}
static void lst_SelectedIndexChanged(object sender, EventArgs e)
{
Console.WriteLine("[!] Selected Index Changed:{0}", lst.SelectedIndex);
}
}
}
Edit:
Я рассматриваю возможность создания собственного списка путем создания класса, который наследуется от ListBox, или создания пользовательского элемента управления. Однако я не уверен, как подойти к этому.
Любые идеи о сокрытии / переопределении метода clear с использованием любого из наследования / userControl?
Потребуется ли скрыть / переопределить другие методы, или есть способ избежать этого?