选择索引已更改事件正在触发两次

时间:2013-10-08 13:26:37

标签: c# winforms events

以下是我的代码示例:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.SelectedItems.Count < 1)
    {
        MessageBox.Show("Please select an item first.");
    }
    else
    {
        string name = listView1.SelectedItems[0].SubItems[0].Text;
        Binddata(name);
    }
}

public void Binddata(string name)
{
    textBox1.Text=name;            
}

我的Windows From将如下所示:

Form

当我第一次点击Item1时,文本框显示Item1。但是,如果我点击Item2,所选项目的数量将变为“0”,因此它将显示消息为“请先选择项目”。如果我按下确定,则事件再次被触发并且Item2被绑定。

如果我遗漏了任何东西,请帮助我。在此先感谢。

4 个答案:

答案 0 :(得分:1)

不确定为什么会发生这种情况,我认为一旦取消选择上一个选定的项目,就会触发一次,第二次选择新项目。

作为解决方法,请使用此类Timer

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        var timer = new System.Windows.Forms.Timer() { Interval = 50 };
        EventHandler handler = null;
        handler = (x, y) =>
        {
            timer.Tick -= handler;
            timer.Enabled = false;
            timer.Dispose();

            if (listView1.SelectedItems.Count < 1)
            {
                MessageBox.Show("Please select an item first.");
            }
            else
            {
                string name = listView1.SelectedItems[0].SubItems[0].Text;
                Binddata(name);
            }
        };
        timer.Tick += handler;
        timer.Enabled = true;
    }

答案 1 :(得分:0)

这是正常行为。唯一不正常的部分是当没有选择项目时你正在抛出一个MessageBox。 ListView可以选择零项,您需要优雅地处理它。

如果你不喜欢这种行为,你应该使用ListBox控件,它总是需要选择1个项目,并且不会抛出多个SelectedIndexChanged事件。

答案 2 :(得分:0)

根据MSDN

  

当用户选择项目而不按CTRL执行   多次选择,控件首先清除先前的选择。   在这种情况下,对于每个项目,此事件都会发生一次   先前已选择,一次为新选择的项目。

您可以检查是否在其他事件处理程序中选择了任何项目,例如按钮单击。

答案 3 :(得分:0)

这是单选控件的正常行为。有关详细信息,请参阅链接:

http://www.knowdotnet.com/articles/listviewselectedindexchanged.html