以编程方式触发ListView.SelectedIndexChanged事件?

时间:2009-04-30 19:10:40

标签: c# winforms listview selectedindexchanged

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

我打算让ListView中的第一项在用户完成某项操作后自动选中。 CodeIndexChanged事件中已存在代码以突出显示所选项目。项目不仅不会突出显示,而且在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事件会正常触发。

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分: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
    }

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