リストボックス(選択モードが1に設定されている)の場合、選択されたアイテムがあるかどうかを追跡したいと思います。そのために、SelectedIndexChangedにメソッドをサブスクライブし、SelectedIndexが-1であるかどうかを確認しました。ただし、SelectedIndexが-1に変更されても(まだ-1でない場合)、Items.Clear()を呼び出した後にイベントが発生しないことに気付きました。
なぜ発火しないのですか?リストをクリアする前にSelectedIndexに-1を割り当てることで、これを回避できることはわかっています。しかし、もっと良い方法はありますか?
これを複製する簡単なコードは次のとおりです。
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);
}
}
}
編集: ListBoxから継承するクラスを作成するか、ユーザーコントロールを作成して、カスタムリストを作成することを検討しています。しかし、私はこれにどのようにアプローチするかわかりません。継承/userControlのいずれかを使用してclearメソッドを非表示/オーバーライドすることに関するアイデアはありますか?他のメソッドも非表示/オーバーライドする必要がありますか、それともこれを回避する方法はありますか?