ListView 似乎像鸡貂一样脾气暴躁,又像[被 PC 删除了] 一样喜怒无常。警察]
在 - 和其他人的帮助下,我能够让 ListView 按照我想要的方式工作 它到 (http://stackoverflow.com/questions/11423537/how-to-add-subitems-to-a-listview)。
现在我正在将这个简单的演示转换为在真正的应用程序中使用。
我在表单的加载事件中创建列:
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,但我想我会出于彻底性/挫败感而尝试。
聚会迟到了,但我刚刚花了一些时间尝试解决类似的问题。我找到的答案是,在填充之前清除列表时,必须使用
listviewGroupItems.Items.Clear();
不是
listviewGroupItems.Clear();
ListView.Clear() 方法清除控件中的所有内容 - 包括列
我今天也遇到了同样的问题。我已经按照用户2867342提到的编码了
listView.Clear()
。我需要将其更改为 listView.Items.Clear()
,但这并没有使列出现。这些列就在那里,我可以单击它们并调整它们的大小,但它们完全是空白的。
OwnerDraw
属性 设置为 true,因为我想绘制自己的进度栏列。 MSDN 对 OwnerDraw 属性的说明如下(重点是我的):
ListView 控件通常由操作系统绘制。为了 自定义 ListView 项目、子项目和列的外观 headers,将 OwnerDraw 属性设置为 true 并提供一个处理程序 以下一个或多个事件:DrawItem、DrawSubItem、 绘制列标题。这称为所有者绘图。 当View属性 设置为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;
}
您的代码中缺少列标题。 (已修复)
根据 MSDN:
“如果您的 ListView 控件没有指定任何列标题,并且您将 View 属性设置为 View.Details,则 ListView 控件将不会显示任何项目。如果您的 ListView 控件没有指定任何列标题,并且您设置了 View 属性改为View.Tile,ListView控件将不会显示任何子项。”
当然,您可能需要进行比我在 SS 中看到的更多的调整,但它至少回答了您为什么会出现空白的问题。
编辑(更改了行,尽管将它们更改回您的代码并没有影响我的成功结果):
lvi.Group = listViewGroupsItems.Groups[currentGroup];
listViewGroupsItems.Items.Add(lvi);
我刚刚发现的另一件事需要检查: OwnerDraw 必须为 false。
从以前的项目复制并粘贴,忘记我使用了 OwnerDraw
有同样的问题。 我的案例的解决方案是 View.Details。
listView.View = View.Details;
listView.Columns.Add("Column 1");
listView.Columns.Add("Column 2");
listView.Items.Add("xxx");
listView.Items[index].SubItems.Add("xxx");