对于 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);
}
}
}
编辑: 我正在考虑通过制作一个从 ListBox 继承的类或制作用户控件来制作自定义列表。但是我不确定如何解决这个问题。关于使用继承/用户控件隐藏/覆盖清除方法的任何想法?它是否还需要隐藏/覆盖其他方法,或者有没有办法避免这种情况?