【问题标题】:selecting Multiple row of items in a ListView在 ListView 中选择多行项目
【发布时间】:2011-12-10 23:51:08
【问题描述】:

我有一个详细视图的树视图。 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 

}

【问题讨论】:

标签: c# winforms listview listviewitem


【解决方案1】:

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; 
    }
}

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

如果您想避免不必要的 SelectedIndexChanged 事件,请尝试 Robert's Timer-ListView approachthis Application.Idle approach(VB.NET 但易于转换)ObjectListView 在后台使用的内容,以防止触发多个事件。

【讨论】:

    【解决方案2】:

    只需以这种方式更改您的方法:

     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;
     } 
    

    【讨论】:

    • 谢谢,这行得通。但仅在第一次鼠标单击一行时。下次它失败并且调试器为string name = resultSheet.SelectedItems[0].Name; 行说InvalidArgument=Value of '0' is not valid for 'index'。介意也解决这个问题吗?!
    • @Sean:编辑 my answer 以考虑您的评论。
    • @TimSchmelter:糟糕,错过了这一点,我的答案也改了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多