我有一个详细视图的树视图。 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
}
答案 0 :(得分:2)
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事件,请尝试Robert's Timer-ListView approach或this Application.Idle approach(VB.NET,但很容易转换)ObjectListView内部使用的内容以防止多个事件触发。
答案 1 :(得分:1)
只需以这种方式更改您的方法:
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;
}