"SelectedIndexChanged"在ListBox中的"Items.Clear()"之后没有触发

Shm*_*ola 8 c# listbox selectedindexchanged winforms

对于ListBox(选择模式设置为One),我希望跟踪是否选择了所选项目.为此,我订阅了一个方法到SelectedIndexChanged并检查SelectedIndex是否为-1.但是,我注意到在调用Items.Clear()之后事件不会触发,即使SelectedIndex更改为-1(如果它还不是-1).

为什么不开火?我知道我可以通过在清除列表之前为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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑: 我正在考虑通过创建一个继承自ListBox的类或通过创建用户控件来创建自定义列表.但是我不知道如何处理这个问题.有关使用inheritance/userControl隐藏/覆盖clear方法的任何想法吗?是否需要隐藏/覆盖其他方法,还是有办法避免这种情况?

dle*_*lev 5

查看Reflector中的代码,Items上的Clear()方法只重置.Net对象的内部对象列表(并且没有,正如您所注意到的那样,触发OnSelectedIndexChanged).

SelectedIndex属性返回-1,因为属性的getter中的逻辑指示如果内部列表中没有项目,则应返回-1.

  • 但它应该解雇这个事件是不是明智的?这是设计的吗?还是一个bug? (2认同)