如何在ListView中取消选择项目?

24

我有一个包含几个项目的 ListView。当 ListView 失去焦点时,最后选定的 ListViewItem 仍以灰色背景“选定”。
我希望在 ListView.FocusLost 事件发生时取消选择,这样就会触发 ListView.SelectedIndexChanged 事件。
有什么想法吗?

我正在使用 .NET CF 3.5。


编辑过了,现在我明白你的句子了。 - Vladimir
8个回答

22

假设你正在从父表单/控件中访问ListView。

你可以在表单或控件的构造函数/加载事件中添加以下代码:

this.myListView.LostFocus += (s, e) => this.myListView.SelectedIndices.Clear();

好的,对于你的情况,你需要用以下内容替换那个委托:

if (this.myListView.SelectedIndices.Count > 0)
    for (int i = 0; i < this.myListView.SelectedIndices.Count; i++)
    {
        this.myListView.Items[this.myListView.SelectedIndices[i]].Selected = false;
    }

顺便说一下,你可以让这段代码的形式更加美观。


2
SelectedIndicesењЁзө§е‡‘жҰ†жһ¶3.5дё­жІҰжњ‰Clear()ж–№жі•гЂ‚ - Zeemee
你的回答基本正确,但是你的代码肯定会抛出'IndexOutOfRange'或'ArgumentOutOfRange'异常,因为在第一次迭代中this.myListView.SelectedIndices.Count数量就会减去1... - Learner

20
myListView.SelectedItems.Clear();

3

我知道现在有些晚了,但如果还有其他人需要解决方案,我想添加一下这个解决方案。

为避免取消选择的项目具有焦点,您需要将Focused属性设置为false。

for (int i = 0; i < this.myListView.SelectedIndices.Count; i++)
{
    this.myListView.Items[this.myListView.SelectedIndices[i]].Selected = false;
    this.myListView.Items[this.myListView.SelectedIndices[i]].Focused = false;
}

2

这很简单。

this.myListView.SelectedIndex = -1;
this.myListView.Update();

5
ListView 没有 SelectedIndex 属性。 - Omer
我的 Xamarin 程序中,这个代码可以正常工作:myListView.SelectedItem = null; .Net Standard 2.0。 - chunyap

1
你可以尝试一下:

MyList.ItemSelected += (sender, e) => {
    ((ListView)sender).SelectedItem = null;
};

如果您在视图的代码后台(xaml.cs)中创建了OnSelection,则可以使用以下方式:

 private void OnSelection(object sender, SelectedItemChangedEventArgs e)
        {
           ((ListView)sender).SelectedItem = null;
        }

问候


1
另一种有效的方法是:

这样做:

foreach (ListViewItem i in myListView.SelectedItems)
{
    i.Selected = false;
}

“ListViewItem”不包含名为“Selected”的定义,也找不到接受类型为“ListViewItem”的第一个参数的扩展方法“Selected”。 - Choletski
@Choletski,我相信@Jeff是想说 i.IsSelected = false; 而不是 i.Selected = false; - Jogge

0
如果你正在使用EditItemTemplate而不是ItemTemplate,你可能一直在努力弄清楚为什么ListView1.SelectedIndex = -1;没有起作用。这是因为你需要使用ListView1.EditIndex = -1;

-2
if (listView1.SelectedItems.Count > 0)
    for (int i = 0; i < listView1.SelectedItems.Count; i++)
    {
        listView1.SelectedItems[i].Selected = false;
    }

这个问题已经在5年前得到了答案。而你的解决方案并没有解决问题 - 你只是取消选择列表中的第一项。 - David Makogon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接