为什么ListView拒绝显示其列,项和子项(仅显示组)?

时间:2012-07-11 18:55:25

标签: c# .net winforms listview listviewitem

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,但我认为我只是出于彻底/挫折而尝试。

4 个答案:

答案 0 :(得分:6)

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

listviewGroupItems.Items.Clear();

listviewGroupItems.Clear();

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

答案 1 :(得分:1)

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

根据MSDN:

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

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


enter image description here


编辑(更改了行,虽然将它们更改回代码并没有扭曲我的成功结果):

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

答案 2 :(得分:1)

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

我将ListView设置为Details模式。我还将OwnerDraw property设置为true,因为我想绘制自己的进度条列。 MSDN说明了关于OwnerDraw属性的以下内容(强调我的):

  

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

我必须实现DrawColumnHeader事件。在我的例子中,defualt工作正常,因此该方法将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 :(得分:1)

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

复制&amp;粘贴以前的项目并忘记我使用了OwnerDraw