如何向 ListView 添加子项?

6
我是一个有用的助手,可以为您翻译文本。
我尝试获得一个最简单的带有子项的Listview的示例。但是这段代码:
private void button1_Click(object sender, EventArgs e) {
    listView1.Groups.Add(new ListViewGroup("Kannst du mich sehen?", HorizontalAlignment.Left));
    string[] strArr = new string[4] { "uno", "dos", "twa", "quad" };
    for (int i = 0; i < strArr.Length; i++)
    {
        ListViewItem lvi = new ListViewItem(strArr[i]);
        listView1.Items.Add(lvi);
        lvi.SubItems.Add("Ciao, Baby!");
        listView1.Items[i].Group = listView1.Groups[0];
    }
}

它并不显示子项(即“Ciao, Baby!”),而是显示:
Kannst du mich sehen?
---------------------
uno   dos   twa   quad

...但我希望它是:

Kannst du mich sehen?
---------------------
uno Ciao, Baby!
dos Ciao, Baby!
twa Ciao, Baby!
quad    Ciao, Baby!

即使更奇怪(在我看来),我得到了这个:
Default
-------
uno dos twa quad    uno dos twa quad

FIRST
-----
uno dos twa quad

使用以下代码:

private void button2_Click(object sender, EventArgs e) {
    string[] strArrGroups = new string[3] { "FIRST", "SECOND", "THIRD" };
    string[] strArrItems = new string[4] { "uno", "dos", "twa", "quad" };
    for (int i = 0; i < strArrGroups.Length; i++)
    {
        listView1.Groups.Add(new ListViewGroup(strArrGroups[i], HorizontalAlignment.Left));
        for (int j = 0; j < strArrItems.Length; j++) {
            ListViewItem lvi = new ListViewItem(strArrItems[j]);
            listView1.Items.Add(lvi);
            lvi.SubItems.Add("Hasta la Vista, Mon Cherri!");
            listView1.Items[j].Group = listView1.Groups[i];
        }
    }
}

更新

如果你问我,ListView的View属性有点疯狂:

默认的"LargeIcon"设置像最初显示的那样(SmallIcon具有相同的效果)。 "Detail"只会给我组标题(没有项目) "List"给出了我的项目(一行一个,就像我想要的那样),但是没有组/标题 "Tile"给了我:

Kannst du mich sehen?
---------------------
uno     dos
twa     quad

...使用button1的代码和:

Default
---------------------
uno     dos
twa     quad
uno     dos
twa     quad

FIRST
---------------------
uno     dos
twa     quad

...with button2's code

Either:

1) I'm stupid
2) ListView is very counterintuitive
-or
3) Nobody ever wants to use the ListView the way I'm trying to use it...if that's the case, should I be using a different control instead?

副问题:由于我经常逛StackOverflow,所以是否有可能成为双重国籍,是否可以从中获得税收优惠?

关于 IT 技术的内容没有提供,请提供具体需要翻译的内容。


@-: 将其更改为details只会给我组名(例如默认和FIRST)。 - B. Clay Shannon-B. Crow Raven
1
这就是为什么昨天我告诉你我喜欢你的问题的原因。我自己也学到了一些东西 :-) - dash
3个回答

3

您需要为SubItem添加另一列。您的subitem未显示的原因是因为没有为其添加列。请尝试以下方法。

listView1.Columns.Add("Column 1"); // you can change the column name
listView1.Columns.Add("Column 2");
string[] strArr = new string[4] { "uno", "dos", "twa", "quad" };
foreach (string x in strArr)
{
    ListViewItem lvi = listView1.Items.Add(x);
    lvi.SubItems.Add("Ciao, Baby!");
}

非常接近;事实上,当我使用View属性的Details枚举(如“-”所建议的那样,不要与“-”(减号)混淆)来编写button1的代码时,它可以工作。对于button2,通过循环的前两次迭代仍然会得到该可恶的“默认”组标题。 - B. Clay Shannon-B. Crow Raven
我现在使用button2得到了“Default”和“Second”组……为什么是“Default”,而且为什么“First”和“Third”没有出现? - B. Clay Shannon-B. Crow Raven

3

这对我有效:

listView1.Columns.Add("Col1");
listView1.Columns.Add("Col2");

string[] strArrGroups = new string[3] { "FIRST", "SECOND", "THIRD" };
string[] strArrItems = new string[4] { "uno", "dos", "twa", "quad" };
for (int i = 0; i < strArrGroups.Length; i++)
{
    int groupIndex = listView1.Groups.Add(new ListViewGroup(strArrGroups[i], HorizontalAlignment.Left));
    for (int j = 0; j < strArrItems.Length; j++)
    {
        ListViewItem lvi = new ListViewItem(strArrItems[j]);
        lvi.SubItems.Add("Hasta la Vista, Mon Cherri!");
        listView1.Items.Add(lvi);
        listView1.Groups[i].Items.Add(lvi);
    }
} 

原来需要将项添加到组中,而不是在项上设置组属性,这与其他问题中所示非常奇怪。
结果是: enter image description here 在 .Net 4、WinForms 和 VS2010 中进行测试。

@-: 你像飓风一样强大! - B. Clay Shannon-B. Crow Raven
不需要 "int groupIndex ="。 - B. Clay Shannon-B. Crow Raven
"groupIndex" 可以传递给 Groups[] 而不是 "i"。非常有用的代码片段,非常感谢。 - AFract

2
尝试在添加子项后再添加该项:
ListViewItem lvi = new ListViewItem(strArr[i]);
lvi.SubItems.Add("Ciao, Baby!");
listView1.Items.Add(lvi);    
listView1.Items[i].Group = listView1.Groups[0];

希望这有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接