4

如何以编程方式触发 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 事件会正确触发。

4

3 回答 3

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;
    }
}
于 2009-04-30T19:17:48.420 回答
2

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

于 2009-04-30T19:18:32.317 回答
2

通过将其设置为 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
    }

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

于 2009-04-30T19:21:20.547 回答