在ListView中选择多行项目

本文关键字:项目 选择 ListView | 更新日期: 2023-09-27 18:17:23

我有一个详细视图的树视图。Listview由条目和子项填充,它们是成对的4行,相互关联。我将这4项中每一行的Name属性设置为相同。

我要找的是,当用户选择一行时,所有具有类似名称属性的4行都将自动选择(突出显示)。

到目前为止我所做的是在下面,但它没有编译!

private void resultSheet_SelectedIndexChanged(object sender, EventArgs e)
{
    string name = resultSheet.SelectedItems[0].Name.ToString();
    ListView.ListViewItemCollection items = new ListView.ListViewItemCollection(resultSheet);
    foreach (ListViewItem item in resultSheet.Items)
    {
        if (item.Name.ToString() == name) 
        {
            items.Add(item);
        }
    }
    resultSheet.SelectedItems = items; //Does not compile 
}

在ListView中选择多行项目

ListView。SelectedItems是只读的

if(resultSheet.SelectedItems.Count >= 1)
{
    string name = resultSheet.SelectedItems[0].Name.ToString();
    foreach (ListViewItem item in resultSheet.Items)
    {
        item.Selected = item.Name.ToString() == name; 
    }
}

Edit:根据你对另一个答案的评论:确保SelectedItems.Count >= 1在访问索引0处的项目之前,因为"No selection"也是一种可能的状态。当您选择另一个项目时,ListView在选择新项目之前取消选中SelectedItem

如果你想避免不必要的SelectedIndexChanged事件,试试Robert的Timer-ListView方法或这个应用程序。闲置的方法(VB。

ObjectListView在底层使用了什么来防止多个事件触发。

就这样改变你的方法:

 bool inAction = false;
 private void resultSheet_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (inAction || (resultSheet.SelectedItems.Count == 0))
     {
         return;
     }
     inAction = true;
     string name = resultSheet.SelectedItems[0].Name;
     foreach (ListViewItem item in resultSheet.Items)
     {
         if (item.Name.ToString() == name)
         {
             item.Selected = true;
         }
     }
     inAction = false;
 } 

编辑:或者如果你喜欢LINQ,这样做:

 bool inAction = false;
 private void resultSheet_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (inAction || (resultSheet.SelectedItems.Count == 0))
     {
         return;
     }
     inAction = true;
     string name = resultSheet.SelectedItems[0].Name;
     foreach (ListViewItem item in resultSheet.Items.OfType<ListViewItem>().Where(item => item.Name == name))
     {
         item.Selected = true;
     }
     inAction = false;
 }