C# 在列表视图中选择多行项目

C# 在列表视图中选择多行项目,c#,winforms,listview,listviewitem,C#,Winforms,Listview,Listviewitem,我有一个详细视图的树状视图。listview由4行中的项和子项填充在一起。我已将这4项中每一行的Name属性设置为相同 我要寻找的是,当用户选择一行时,所有具有相似名称属性的4行都会被自动选择(hilighted) 到目前为止,我所做的都在下面,但它没有编译 private void resultSheet_SelectedIndexChanged(object sender, EventArgs e) { string name = resultSheet.SelectedItems[

我有一个详细视图的树状视图。listview由4行中的项和子项填充在一起。我已将这4项中每一行的
Name
属性设置为相同

我要寻找的是,当用户选择一行时,所有具有相似名称属性的4行都会被自动选择(hilighted)

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

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 

}

只需通过以下方式更改您的方法:

 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;
 } 
bool不活动=false;
私有无效结果表\u SelectedIndexChanged(对象发送者,事件参数e)
{
if(不活动| |(resultSheet.SelectedItems.Count==0))
{
返回;
}
不作为=正确;
字符串名称=结果表。SelectedItems[0]。名称;
foreach(resultSheet.Items.OfType()中的ListViewItem项,其中(item=>item.Name==Name))
{
item.Selected=true;
}
不作为=错误;
} 

只需通过以下方式更改您的方法:

 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;
 } 
bool不活动=false;
私有无效结果表\u SelectedIndexChanged(对象发送者,事件参数e)
{
if(不活动| |(resultSheet.SelectedItems.Count==0))
{
返回;
}
不作为=正确;
字符串名称=结果表。SelectedItems[0]。名称;
foreach(resultSheet.Items.OfType()中的ListViewItem项,其中(item=>item.Name==Name))
{
item.Selected=true;
}
不作为=错误;
} 
是只读的

if(resultSheet.SelectedItems.Count >= 1)
{
    string name = resultSheet.SelectedItems[0].Name.ToString();
    foreach (ListViewItem item in resultSheet.Items)
    {
        item.Selected = item.Name.ToString() == name; 
    }
}
编辑:根据您对另一个答案的评论:在访问索引0处的项目之前,确保
SelectedItems.Count>=1
,因为“无选择”也是一种可能的状态。选择其他项目时,ListView会在选择新项目之前取消选择SelectedItem

如果要避免不必要的SelectedIndexChanged事件,请尝试或(VB.NET,但很容易转换)引擎盖下用于防止触发多个事件的内容。

为只读

if(resultSheet.SelectedItems.Count >= 1)
{
    string name = resultSheet.SelectedItems[0].Name.ToString();
    foreach (ListViewItem item in resultSheet.Items)
    {
        item.Selected = item.Name.ToString() == name; 
    }
}
编辑:根据您对另一个答案的评论:在访问索引0处的项目之前,确保
SelectedItems.Count>=1
,因为“无选择”也是一种可能的状态。选择其他项目时,ListView会在选择新项目之前取消选择SelectedItem


如果要避免不必要的SelectedIndexChanged事件,请尝试或(VB.NET但易于转换)引擎盖下用于防止触发多个事件的内容。

为只读。是只读的。谢谢,这很有效。但仅在第一次鼠标单击一行。下一次失败时,调试器说“0”的
InvalidArgument=值对于
string name=resultSheet的“index”无效行。介意也修一下吗@肖恩:为了考虑你的评论而编辑。@TimSchmelter:Oops,错过了这一点,在我的回答中也修改了它。谢谢,这很有效。但仅在第一次鼠标单击一行。下一次失败时,调试器说“0”的
InvalidArgument=值对于
string name=resultSheet的“index”无效行。介意也修一下吗@肖恩:为了考虑你的评论而编辑。@TimSchmelter:Oops,错过了这一点,在我的回答中也改变了它。