【问题标题】:Fire ListView.SelectedIndexChanged Event Programmatically?以编程方式触发 ListView.SelectedIndexChanged 事件?
【发布时间】:2009-04-30 19:10:40
【问题描述】:

如何以编程方式触发 ListView 的 SelectedIndexChanged 事件?

我打算让我的 ListView 中的第一项在用户完成某个操作后自动被选中。 SelectedIndexChanged 事件中已存在用于突出显示所选项目的代码。不仅该项目无法突出显示,而且在 SelectedIndexChanged 中设置的断点也永远不会被命中。此外,Debug.WriteLine 无法产生输出,所以我很确定该事件没有触发。

以下代码未能触发事件:

listView.Items[0].Selected = false;
listView.Items[0].Selected = true;
listView.Select();
Application.DoEvents();

额外的 .Select() 方法调用被包括在内是为了很好的衡量。 ;) 取消选择 (.Selected = false) 用于取消选择 .Items 集合中的 ListViewItem,以防它可能已被默认选中,因此将其设置为“true”将无效。 'Application.DoEvents()' 调用是另一种最后的方法。

上面的代码不应该触发 SelectedIndexChanged 事件吗?

我应该提到,当通过键盘或鼠标输入选择项目时,SelectedIndexChanged 事件会正确触发。

【问题讨论】:

    标签: c# winforms listview selectedindexchanged


    【解决方案1】:

    通过将其设置为 false 来取消选择不会触发事件,但将其设置为 true 会。

        public Form1 ()
        {
            InitializeComponent();
            listView1.Items[0].Selected = false; // Doesn't fire
            listView1.Items[0].Selected = true; // Does fire.
        }
    
        private void listView1_SelectedIndexChanged (object sender, EventArgs e)
        {
            // code to run
        }
    

    你可能有其他事情发生。你在运行你的选择代码是什么事件?

    【讨论】:

    • 有趣的是,这并没有像 mouseclick 一样突出当前选择。
    • 如果项目被选中,取消选择确实会触发所选索引更改。默认情况下,它们是未选中的,因此您的 Selected = false 无法触发事件。
    • Joshua,选择代码在 RunWorkerCompleted 事件中运行,该事件在长时间运行的线程完成时触发: bw = new BackgroundWorker() bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(listViewSelectingEvent);此事件中的其他代码能够更改表单上其他控件的各种属性,所以我认为这不是线程问题。
    • 很抱歉,我在线程方面很弱。您是否使用调用调用来更改属性? Process 有一个 EnableRaisingEvents 属性,我想知道您使用的工作线程是否有类似的东西。另外,查看这篇文章,可能有一些有价值的东西。 weblogs.asp.net/justin_rogers/articles/126345.aspx
    • 原来确实是线程问题。谢谢你的链接。对于以后发现此线程的其他人,请注意您的 ListView 将能够从您打算修改选择属性的线程接收事件。
    【解决方案2】:

    为什么不能将当前在事件处理程序方法中的代码移动到可以从原始位置以及代码中调用的方法中?

    类似这样的:

    class Foo
    {
        void bar(Object o, EventArgs e)
        {
            // imagine this is something important
            int x = 2;
        }
    
        void baz()
        {
            // you want to call bar() here ideally
        }
    }
    

    将被重构为:

    class Foo
    {
        void bar(Object o, EventArgs e)
        {
            bop();
        }
    
        void baz()
        {
            bop();
        }
    
        void bop()
        {
            // imagine this is something important
            int x = 2;
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果创建从ListView 派生的类,则可以调用受保护的方法OnSelectedIndexChanged。这将触发 SelectedIndexChanged 事件。

      【讨论】:

        猜你喜欢
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 2015-07-21
        • 2014-03-16
        相关资源
        最近更新 更多