隐藏 ListViewItem 而不是删除它?
Posted
技术标签:
【中文标题】隐藏 ListViewItem 而不是删除它?【英文标题】:Hiding ListViewItem instead of removing it? 【发布时间】:2014-10-14 18:39:01 【问题描述】:不显示ListViewItem
的常用方法是删除它。
在我当前的项目中,与仅隐藏项目的可能性相比,这使事情变得过于复杂。
有没有办法隐藏ListViewItem
而不是删除它?
到目前为止我所尝试的:
使用OwnerDraw=true
,DrawItem
事件不会提供任何有用的信息:Bounds
是只读的,更改Item
的属性是没有用的。
继承 ListView
并覆盖 WndProc
是我的下一次尝试,
但我找不到任何有帮助的LVM_???
messages。LVM_SETITEMPOSITION
仅在View
是图标或小图标时使用。
【问题讨论】:
@mashet:抱歉,这适用于 .NET Windows 窗体 对不起,我错过了 你不能隐藏一个项目,只有删除它才有效。 【参考方案1】:您可以维护一个内部列表,该列表存储一个子类 ListViewItem 并具有 Visible 字段的 Item。基本思路如下:
public class ListView2 : ListView
private List<Item2> list = new List<Item2>();
public class Item2 : ListViewItem
public bool Visible = true;
public Object Value = null;
public override string ToString()
return (Value == null ? String.Empty : Value.ToString());
public Item2 this[int i]
get
return list[i];
public int Count
get
return list.Count;
public void Add(Object o)
Item2 item = new Item2 Value = o, Text = (o == null ? string.Empty : o.ToString()) ;
Items.Add(item);
list.Add(item);
public void RefreshVisibleItems()
var top = (Item2) this.TopItem;
Items.Clear();
int k = 0;
foreach (var o in list)
if (o == top)
break;
if (o.Visible)
k++;
Items.AddRange(list.FindAll(i => i.Visible).ToArray());
if (k < Items.Count)
this.TopItem = Items[k];
var lv = new ListView2();
lv.View = View.Details;
lv.Columns.Add("Column1", 100, HorizontalAlignment.Center);
Button btn = new Button Text = "Hide" , Dock = DockStyle.Bottom ;
lv.Dock = DockStyle.Fill;
for (char c = 'A'; c <= 'Z'; c++)
lv.Add(c);
var f1 = new Form1();
f1.Controls.Add(lv);
f1.Controls.Add(btn);
btn.Click += delegate
if (lv.Items.Count == 0)
for (int i = 0; i < lv.Count; i++)
lv[i].Visible = true;
else
lv[lv.Items.Count - 1].Visible = false;
lv.RefreshVisibleItems();
;
Application.Run(f1);
【讨论】:
【参考方案2】:看看这个。可能会有所帮助Hide options in a select list using jQuery
$("option[value=" + title + "]").hide();
【讨论】:
以上是关于隐藏 ListViewItem 而不是删除它?的主要内容,如果未能解决你的问题,请参考以下文章
从 ListView 获取 ListViewItem 而不是 Item