【问题标题】:How to hide a column in a ListView control?如何隐藏 ListView 控件中的列?
【发布时间】:2011-12-10 07:58:40
【问题描述】:

如何隐藏ListView 控件中的列,而不将列Width 属性设置为0

另外,我可以锁定列的Width 吗?

【问题讨论】:

  • Listview 不是网格,功能有限。我想你可以阻止列调整大小或拖放,但你不能隐藏和显示列,除非改变它的宽度,如果你删除它并在之后重新添加它可能会起作用,但取决于你的逻辑。
  • ListView 默认没有列。您是否正在向ItemTemplate 添加列?

标签: c# .net winforms listview


【解决方案1】:

最简单的方法如下,试试这段代码:

隐藏:

      LVW.Columns.Item(0).Width = 0

再次显示:

      LVW.Columns.Item(0).AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent)

这对某人有帮助吗?

【讨论】:

  • 非常适合我。
  • 此解决方案没有回答问题(它要求不要将宽度更改为 0),但由于从列表视图中删除列可能会导致比将宽度设置为零更多的工作 - 它仍然可能要走的路。
【解决方案2】:

只需删除所需索引处的列:

listView1.Columns.RemoveAt(3);

当你想要它时,只需插入它的名字:

listView1.Columns.Insert(3, "Column Name");

它将返回其值。

【讨论】:

  • 这可能会改变其他列的子项索引吗?
【解决方案3】:

如果您需要将数据与一行相关联而不显示它,请使用 ListView 的 Tag 属性

【讨论】:

  • -1 Tag 有点可恶,你能做的只有这么多。更好的方法是简单地从 ListViewItem 类继承并将您自己的属性/字段添加为真实成员。这样您就拥有了一个干净、明确且可扩展的架构。
  • 这取决于你想做什么标签是好的。
【解决方案4】:

不太清楚这里C++Cli标签的重要性,但是:

我认为,如果您在谈论 ListView 中的列,则您处于控件的详细信息视图中。据我所知,ListView 中没有内置的隐藏/显示列方式,因此其中一种解决方案可以只是删除该列表单 UI。

要以最流畅的方式做到这一点,只需在两者之间调用ListView 列重新生成代码

listView.SuspendLayout(true);

/*Manipulate column here*/

listView.ResumeLayout();

ListView 上可见的数据始终“在您的手中”,因此此时您将决定再次显示该列,只需显示该列并再次填写 ListView

希望这会有所帮助。

【讨论】:

    【解决方案5】:

    我正在寻找一种方法来做同样的事情,这让我来到了这里。

    我不确定是否有更好的方法,所以我使用以下解决方法。

    如果您需要向 Listview 项目添加值但不想显示它,则可以使用大于总列数的子项目索引。这样,即使值存在,用户也看不到它。

    【讨论】:

    • 这非常适合我。没想到您可以添加比列更多的子项,但看起来可以。我需要一种简单的方法来隐藏每个项目的文件路径,以便单击时我可以打开该文件夹,这很好用。也不必更改任何代码。刚刚删除了该列!
    【解决方案6】:

    如何隐藏/显示列表视图列

    C#、.NET 框架 3.5。

    如果您在“虚拟模式”下使用列表视图,隐藏和显示列表视图列很容易。在“虚拟模式”中,您负责用数据填充列表视图项。这样就可以将正确的数据放在正确的列中。

    让我演示一下: 创建一个表单,并添加一个listview控件和一个按钮控件。 将 3 列添加到列表视图控件。 将 listview 控件的“view”属性设置为“Details”。 将列表视图控件的“VirtualMode”属性设置为“True”。 将列表视图控件的“VirtualListSize”属性设置为“100”。 在表单中添加一个布尔值:

    private bool mblnShow = true;
    

    为listview控件添加“RetrieveVirtualItem”事件,并添加如下代码:

    ListViewItem objListViewItem = new ListViewItem();
    objListViewItem.Text = "Item index: " + e.ItemIndex.ToString();
    if (mblnShow) objListViewItem.SubItems.Add("second column: " +     DateTime.Now.Millisecond.ToString());
    objListViewItem.SubItems.Add("third column: " + DateTime.Now.Millisecond.ToString());
    e.Item = objListViewItem;
    

    为按钮控件添加“点击”事件,并添加如下代码:

    mblnShow = !mblnShow;
    if (mblnShow && !this.listView1.Columns.Contains(this.columnHeader2))   this.listView1.Columns.Insert(1, this.columnHeader2);
    else if (!mblnShow && this.listView1.Columns.Contains(this.columnHeader2))
        this.listView1.Columns.Remove(this.columnHeader2);
    

    运行应用程序,然后按下按钮显示和隐藏第二列。

    请注意,如果您将数据放入项目集合中,在虚拟模式下运行列表视图会引发错误。关于虚拟模式的知识还有很多,所以我建议在使用它之前阅读它。

    【讨论】:

      【解决方案7】:

      您应该使用 DataTemplateSelector 在列表视图中动态隐藏和显示列或行。官方文档中有一篇有趣的文章。 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/templates/data-templates/selector

      【讨论】:

        【解决方案8】:

        转到编辑列(在设计模式下列表视图的属性下),在杂项下将宽度设置为零

        【讨论】:

        • "未将列 Width 属性设置为 0"。
        【解决方案9】:

        如果您只有一列,则会显示第二个空列以填充右侧的额外空间。要隐藏此空列,请实现 listview resize 事件。在那里执行以下操作。

        m_lstItems.Columns[0].Width = m_lstItems.Width - 5;
        

        这将有效地隐藏多余的空列,而是让第一列占用列表视图中的所有空间。

        【讨论】:

        • 宽度为负值将始终将该列设置为自动填充空白区域,与隐藏列无关
        猜你喜欢
        • 2012-02-17
        • 2012-12-08
        • 1970-01-01
        • 2014-09-18
        • 2021-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 2016-11-05
        相关资源
        最近更新 更多