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

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

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

到目前为止我所尝试的:

  1. 使用OwnerDraw=trueDrawItem 事件不会提供任何有用的信息:
    Bounds 是只读的,更改Item 的属性是没有用的。

  2. 继承 ListView 并覆盖 WndProc 是我的下一次尝试,
    但我找不到任何有帮助的LVM_??? messages
    LVM_SETITEMPOSITION 仅在View 是图标或小图标时使用。

【问题讨论】:

  • @mashet:抱歉,这适用于 .NET Windows 窗体
  • 对不起,我错过了
  • 你不能隐藏一个项目,只有删除它才有效。

标签: c# winforms listview visibility listviewitem


【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多