C# C ListView阻止选择

C# C ListView阻止选择,c#,C#,我使用的是多选列表视图,最多可以选择三个项目。我目前有以下代码 private void grassListView_SelectedIndexChanged(object sender, EventArgs e) { string landType = this.grassLandTypeComboBox.Text; if (this.grassListView.SelectedIndices.Count < 4) {

我使用的是多选列表视图,最多可以选择三个项目。我目前有以下代码

    private void grassListView_SelectedIndexChanged(object sender, EventArgs e)
    {
        string landType = this.grassLandTypeComboBox.Text;
        if (this.grassListView.SelectedIndices.Count < 4)
        {
            ArrayList selectedGrassTextures = (ArrayList)((Hashtable)this.paintGrass[landType])["textures"];
            selectedGrassTextures.Clear();
            foreach (ListViewItem listViewItem in this.grassListView.SelectedItems)
            {
                selectedGrassTextures.Add(listViewItem.Text);
            }
        }
        else
        {
           MessageBox.Show("You cannot have more than 3 grasses selected for any given attribute type");
        }
    }

这段代码有效,最终我的selectedGrassTextures哈希表只有三个元素。但是,GUI仍将元素显示为已选择/聚焦?。因此,对于用户来说,它似乎仍然处于选中状态。所以我想防止这种情况发生,有没有什么我可以用来找到最后点击的元素,并把它的选择或焦点。另一种方法是,如果SelectedIndexChanged之前有一个事件,我可以将我的<4支票移入其中。我想ListView.SelectedIndexChanging是否存在这样的事件,但在我的IDE中它显示为不存在。我正在使用visual studio express和framework 3.5,无法将4.5用于我正在执行的操作。

将其放入ItemSelectionChanged事件中:

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (listView1.SelectedItems.Count > 4) e.Item.Selected = false;
    }

是的,这是错误的;这会将新代码绑定到SelectionIndexChanged事件的旧处理程序。你应该双击designer中的ItemSelectionChanged事件,你会得到一个额外的事件块,其中包含一个不同的、更有用的e参数,其中包括对所讨论项目的引用。啊哈,这很有道理,我自己刚刚又浏览了msdn,发现了它。Indexchange是不推荐使用的还是其他什么,我应该始终使用ItemSelectionChanged吗?不,它们共存并且定义略有不同,尽管我无法解释区别是什么。如果您确实想,可以在清除之前将其从处理程序中删除,然后再添加回来。只需从designer.cs复制这一行,并将其添加到clear之前和之后,并将第一行从+=更改为-=正如您所说,您是c新手。请允许我添加关于删除并重新添加到eventhandler的技术的最后两条注释:正如语法所示,可以将多个事件绑定到一个处理程序。删除并重新添加的将移动到队列中的最后一个位置。有时更可能出现问题:如果beteween中的内容失败,您要么崩溃,要么跳转到错误事件处理程序;因此,如果这看起来是可能的,那么最好将其包装在try块中,并将重新添加的行放在finally子句中。干杯,t