隐藏 ListViewItem 而不是删除它?

Posted

技术标签:

【中文标题】隐藏 ListViewItem 而不是删除它?【英文标题】:Hiding ListViewItem instead of removing it? 【发布时间】:2014-10-14 18:39:01 【问题描述】:

不显示ListViewItem 的常用方法是删除它。 在我当前的项目中,与仅隐藏项目的可能性相比,这使事情变得过于复杂。

有没有办法隐藏ListViewItem 而不是删除它?

到目前为止我所尝试的:

    使用OwnerDraw=trueDrawItem 事件不会提供任何有用的信息: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

如何从移动版本中删除滑块而不是隐藏它?

ListViewItem 的组未通过另一个集合保留

使用 CSS 隐藏行而不是使用 DataTables 删除节点

隐藏块而不是删除

我如何删除我的情况