对于列表框(选择模式设置为“一”),我希望跟踪是否有选定的项目或没有选定的项目。为此,我订阅了 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 的类或创建一个用户控件来创建自定义列表。但是我不知道如何解决这个问题。
关于使用继承/用户控件隐藏/覆盖清除方法有什么想法吗?
是否还需要隐藏/覆盖其他方法,或者有没有办法避免这种情况?
查看 Reflector 中的代码,Items 上的 Clear() 方法只是重置 .Net 对象的内部对象列表(并且不会像您注意到的那样触发 OnSelectedIndexChanged)。
SelectedIndex 属性返回 -1,因为该属性的 getter 中的逻辑规定,如果内部列表中没有项目,则应返回 -1。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)