【问题标题】:Why does the ListView refuse to display its columns, items, and subitems (shows only Group)?为什么 ListView 拒绝显示其列、项和子项(仅显示组)?
【发布时间】:2012-07-11 11:23:47
【问题描述】:

ListView 似乎像鸡貂一样脾气暴躁,像 [被 P.C.警察]

在 - 和其他人的帮助下,我能够让 ListView 像我想要的那样工作 它到 (http://stackoverflow.com/questions/11423537/how-to-add-subitems-to-a-listview)。

现在我正在转换这个简单的演示,以便在实际应用中使用。

我在表单的 Load 事件中创建列:

listViewGroupsItems.Columns.Add(colHeadName);
listViewGroupsItems.Columns.Add(colHeadRate);

...但它们不显示。但是,我的第一项上方有一个空行。那么为什么没有显示文本值。他们“在那里”但看不见吗?为什么他们会被消灭?

反正我想看到的是:

column1Title    column2Title
Group1Name
Item        subitem
Item        subitem
Group2Name
Item        subitem
Group1Name
Item        subitem
Item        subitem
Item        subitem
Item        subitem

...但我实际看到的只是:

[blank line]
Group1Name

...就是这样!

ListView 的 View 属性设置为 Details;否则,所有属性都是默认值。

我的列表视图代码是:

private void AddGroupsAndItems() {
    Dictionary<string, string> GroupsDict = PlatypusData.GetGroupsForTopLevel(Convert.ToInt32(labelTopLevel.Tag));
    int currentGroup = 0;
    foreach (KeyValuePair<string, string> entry in GroupsDict) {
        string GroupNumber = entry.Key;
        string GroupName = entry.Value;
        listViewGroupsItems.Groups.Add(new ListViewGroup(GroupName, HorizontalAlignment.Left));

        Dictionary<string, string> ItemsDict = PlatypusData.GetItemsForGroup(GroupNumber);
        foreach (KeyValuePair<string, string> itemEntry in ItemsDict) {
            string itemID = itemEntry.Key;
            string itemName = itemEntry.Value;
            ListViewItem lvi = new ListViewItem(string.Format("{0} ({1})", itemName, itemID));
            lvi.SubItems.Add(PlatypusData.GetDuckbillNameForItemId(itemID));
            listViewGroupsItems.Items.Add(lvi);
            listViewGroupsItems.Groups[currentGroup].Items.Add(lvi);
        }
        currentGroup++;
    }
}

更新

我将表单的 Load 事件中的代码更改为:

var colHeadName = new ColumnHeader { Text = Resources.RateRequestForm_RateRequestForm_Load_Billing_Account_Client, Width = 160 };
var colHeadRate = new ColumnHeader { Text = Resources.RateRequestForm_RateRequestForm_Load_RatePlan_ID, Width = 120 };
listViewCustomerBillAccountsClients.Columns.Add(colheadName); //colHeadName);
listViewCustomerBillAccountsClients.Columns.Add(colheadRate); //colHeadRate);

...到:

ColumnHeader colheadName = new ColumnHeader();
ColumnHeader colheadRate = new ColumnHeader();
listViewCustomerBillAccountsClients.Columns.Add(colheadName); 
listViewCustomerBillAccountsClients.Columns.Add(colheadRate);

...完全没有区别。

似乎 ColumnHeader 构造函数应该能够获取它应该显示的字符串,但即使我这样做:

ColumnHeader colheadName = new ColumnHeader("This");
ColumnHeader colheadRate = new ColumnHeader("That");

...仍然没有变化(根据 Intellisense 或其他名称,字符串 arg 是 ImageKey,但我想我会出于彻底/沮丧而尝试。

【问题讨论】:

  • 您是否将 View 属性设置为“详细信息”?
  • @Beaner - 是的,帖子中提到了(查看 = 详细信息)。

标签: c# .net winforms listview listviewitem


【解决方案1】:

聚会迟到了,但我刚刚花了一些时间试图解决一个类似的问题。我找到的答案是,在填写之前清除列表时,必须使用

listviewGroupItems.Items.Clear();

不是

listviewGroupItems.Clear();

ListView.Clear() 方法清除控件中的所有内容——包括列

【讨论】:

    【解决方案2】:

    我今天遇到了同样的问题。我已将 listView.Clear() 编码为 user2867342 提到的。我需要将其更改为listView.Items.Clear(),但这并没有使列出现。列在那里,我可以单击它们并调整它们的大小,但它们完全是空白的。

    我将 ListView 设置为详细信息模式。我还将OwnerDraw property 设置为true,因为我想绘制自己的进度条列。 MSDN 对 OwnerDraw 属性有以下说明(重点是我的):

    ListView 控件通常由操作系统绘制。为了 自定义 ListView 项、子项和列的外观 标头,将 OwnerDraw 属性设置为 true 并提供处理程序 以下一个或多个事件:DrawItem、DrawSubItem、 绘制列头。这称为所有者绘图。 当查看属性 设置为 View.Details,所有三个事件都会发生;否则,只有 DrawItem 事件发生。

    我必须实现 DrawColumnHeader 事件。就我而言,默认值工作正常,因此该方法将 DrawDefault 事件参数设置为 true。实现此事件处理程序后,列标题正确显示:

    ...Windows.Forms designer code...
    listView.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(this.listView_DrawColumnHeader);
    ...
    
    private void listView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
    {
        e.DrawDefault = true;
    }
    

    【讨论】:

      【解决方案3】:

      您的代码中缺少列标题。 (固定)

      根据 MSDN:

      "如果您的 ListView 控件没有指定任何列标题并且您将 View 属性设置为 View.Details,则 ListView 控件将不会显示任何项目。如果您的 ListView 控件没有指定任何列标题并且您将View 属性为 View.Tile,ListView 控件不会显示任何子项。”

      当然,您可能需要进行比您在我的 SS 中看到的更多的调整,但它至少回答了您为什么会出现空白的问题。



      编辑(更改的行,尽管将它们更改回您的代码并没有影响我的成功结果):

      lvi.Group = listViewGroupsItems.Groups[currentGroup];
      listViewGroupsItems.Items.Add(lvi);
      

      【讨论】:

      • 但是我正在创建它们,正如我上面所说的(“我在表单的加载事件中创建列”)......哦,列 HEADERS;好的,我会捷克的,谢谢。
      • 我很好奇您在帖子中使用 listViewCustomerBillAccountsClients 并在代码中使用 listViewGroupsItems。它们是 2 个不同的列表视图吗? (另外,我每分钟左右都在监控这篇文章,所以我会很快回复)
      • 打错字了——我想把真名改成假名,忘了把前者改成后者。我现在就这样做。对于造成的混乱,我深表歉意。
      • 我很难怀疑我提供的基本代码的正确性。 (这里不按我的喇叭,只是说代码本身是多么简单)。我将构造函数添加到表单加载事件并获得了相同的成功结果。我忘了提及我确实在屏幕截图中更改了 2 行代码,请参阅我在帖子底部的编辑以了解更改的行。
      • 通过我的简单示例,我也让它工作,所以我有点困惑为什么它让我适合稍微复杂的场景。
      【解决方案4】:

      我刚刚发现的另一件事要检查: OwnerDraw 必须为 false。

      从以前的项目中复制粘贴,忘记了我使用 OwnerDraw

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 2017-12-10
        • 2016-05-22
        • 1970-01-01
        相关资源
        最近更新 更多