【问题标题】:Empty ListViewGroup is not shown in ListViewListView 中不显示空 ListViewGroup
【发布时间】:2012-03-22 14:37:08
【问题描述】:

我在 MSDN ListView.Groups Property 上找不到任何关于将隐藏空 ListViewGroup 的评论。是设计使然,还是我遗漏了什么?我下面的示例代码将仅显示带有项目“item1”的“组 2”。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
      Handles MyBase.Load
    '
    Dim gr = New ListViewGroup("group 1")
    ListView1.Groups.Add(gr)
    '
    Dim gr2 = New ListViewGroup("group 2")
    ListView1.Groups.Add(gr2)
    '
    Dim lvi As New ListViewItem("item1")
    ListView1.Items.Add(lvi)
    '
    gr2.Items.Add(lvi)
End Sub

更新: 有什么方法可以在不添加虚拟项目的情况下显示 ListViewGroup

目前我唯一的解决方法是使用collapsible listview(Vista 及更高版本)

【问题讨论】:

  • 据我所知,空组根本不显示。您可以添加一个空白字符串项来显示该组。
  • 正确。空组不显示。您必须先向它们添加项目。

标签: c# .net vb.net winforms listview


【解决方案1】:

此方法确保 ListViewGroup 显示

void MakeSureListViewGroupHeaderShows(ListView lv)
{
    foreach (ListViewGroup lvg in lv.Groups)
    {
        if (lvg.Items.Count == 0)
        {
            // add empty list view item
            ListViewItem lvi = new ListViewItem(string.Empty);
            lvi.Group = lvg;
            lv.Items.Add(lvi);
        }
        else
        {
            // remove our dummy list view item
            foreach (ListViewItem lvi in lvg.Items)
            {
                if (lvi.Text == string.Empty)
                {
                    lvi.Remove();
                }
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    Better ListView 可以做到这一点。有一个 ShowEmptyGroups 属性可以解决问题:

    还有一个Better ListView Express,它是免费软件,也支持群组。它不是 ListView 包装器,而是对所有功能的完全重新实现,100% 托管并且刚刚改进... :-)

    【讨论】:

      【解决方案3】:

      不推荐我在上面谈论的 hack。但是,如果您真的希望显示空组,那么您只需将添加代码委托给一个单独的实用程序方法,该方法检查组是否为空。如果是,则将其添加到“默认”组(因此至少会显示),直到您向其中添加项目。

      public static void AddGroup(this ListView lv, ListViewGroup lg)
      {
          if (lg.Items.Count > 0 || lv.Items.Cast<ListViewItem>().Any(tg => tg.Group == lg))
              lv.Groups.Add(lg);
          else
          {
              var item = lv.Items.Add(lg.Header);
              item.Tag = lg;
          }
      }
      
      public static void AddItem(this ListView lv, ListViewItem li, string groupKey) // Could also take ListViewGroup here...
      {
          if (lv.Groups[groupKey] == null && lv.Items.ContainsKey(groupKey))
          {
              lv.Groups.Add((ListViewGroup)lv.Items[groupKey].Tag);
              lv.Items.RemoveByKey(groupKey);
          }
          lv.Items.Add(li);
          li.Group = lv.Groups[groupKey];
      }
      
      public static void AddItem(this ListView lv, ListViewItem li, ListViewGroup lg)
      {
          lv.AddItem(li, lg.Header);
      }
      

      另一个警告,不推荐。这是相当多的开销,而且不值得麻烦(IMO)。但是,嘿,各有各的。这段代码完全未经测试,只是把它扔在那里以防你真的需要它来工作(永远不应该是这种情况,最好寻找替代方案)。最糟糕的部分是 Group 声明几乎只是驻留在 ListItem 本身中,这样您就可以很容易地更改组。

      最后一次警告,不推荐。

      编辑:我已将上面的代码修改为 ListView 对象的扩展方法,这样您就可以从方法直接访问 ListView。任何时候你添加一个组,你只需调用listView.AddGroup,添加一个你可以使用listView.AddItem方法的项目。这与listView.Items.AddlistView.Groups.Add 方法相反。要记住的一件事是您不需要将项目分配给组,而只需将组分配给项目。这使得您可以通过更改引用在组之间切换项目,而不必在组之间删除/添加引用。这还假设您已将 ListItemGroup 的 Header 声明为与 Key 相同(换句话说,new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/)。否则,您只需更改 AddItem 中的逻辑即可引用正确的值(通常是Name)。

      【讨论】:

        【解决方案4】:

        “今年早些时候,我在考虑显示空组时遇到了同样的问题。Microsoft,按照设计,不会显示没有任何项目的组名。您需要做的是创建/添加一个空项目或包含文本空白字符的项目到组。当您有实际数据项要为该组填充时,您必须记住从该组中删除空/空白项目。"

        来源:http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/39681a70-d992-4046-ad7e-21a2e33791b1

        【讨论】:

          【解决方案5】:

          Microsoft 设计无法实现。
          看看social.msdn.microsoft.com上的这个讨论。
          不要被标题所迷惑。它谈论空组。

          【讨论】:

          • 没错。看ListView的源码,所有的绘制和分组都是通过PInvokes完成的,这意味着这不仅仅是简单的重写ListView的draw方法。可能有一种方法可以通过使用我将发布的一些“hack”来实现,但这并不漂亮。
          • 在这种情况下,我支持微软的设计决策。我不喜欢开一个群,里面什么都没有。最好不要显示任何内容。
          猜你喜欢
          • 2021-10-04
          • 2013-11-29
          • 2011-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-15
          • 2018-05-31
          相关资源
          最近更新 更多