将自定义对象添加到 C# 中的选中列表框
本文关键字:列表 自定义 对象 添加 | 更新日期: 2023-09-27 17:55:44
我有一个对象,它存储两个字符串并覆盖 ToString() 方法以返回其中一个字符串
fooBar temp;
foreach (string foo in bar)
{
temp = new fooBar(); <--- Why is this line needed when I
am overwriting the code and path on each cycle before adding?
temp.code += ".";
temp.path += ".";
Console.WriteLine(temp);
clbFooBar.Items.Add(temp);
}
打印到控制台遵循覆盖的代码和路径字符串值,但选中的列表框项都是完全相同的(最后一项的 ToString()),发生了什么底层过程不是很明显?
如果我将其更改为clbFooBar.Items.Add(temp.ToString());
它绝对可以正常工作,但这不会与temp.ToString.ToString()
相同,因为.Add
首先调用.ToString()
?我认为控制台打印和.Add
的行为相同,因为它们都称之为ToString()
编辑:temp = new fooBar();
是我问题的解决方法,我只想知道为什么这是修复程序,当直觉使我认为覆盖两个字符串,代码和路径应该足够了,以及为什么没有这种重新初始化,选中列表框中的所有项目都是相同的。
所以你的问题似乎是为什么你的代码工作正常,如果你保持行
temp = new fooBar();
在您的循环中,但如果省略此行,则会用所有相等的项目填充您的CheckedListBox
。
原因是,如果您只在循环外创建一个fooBar
实例,如下所示:
fooBar temp; = new fooBar();
foreach (string foo in bar)
{
temp.code += ".";
temp.path += ".";
clbFooBar.Items.Add(temp);
}
然后,多次添加同一实例,并在每次迭代中更改该实例的属性。
如果您像这样在循环中创建新实例:
foreach (string foo in bar)
{
fooBar temp; = new fooBar();
temp.code += ".";
temp.path += ".";
clbFooBar.Items.Add(temp);
}
每次迭代都有一个新实例,并且不会更改已添加的实例。
更新:刚刚注意到它们看起来仍然与您将它们全部设置为code
和temp
的任何默认值以及"."
一样。所以现在还不清楚你到底想做什么。 也许是这样的:
string s = string.Empty;
foreach (string foo in bar)
{
s += ".";
fooBar temp; = new fooBar();
temp.code = s;
temp.path = s;
clbFooBar.Items.Add(temp);
}
您正在foreach
循环之外创建temp
,然后在内部对其进行初始化。
如果你没有在循环的每次传递中重新初始化,你最终得到的是一个CheckedListBox
,其中所有项目都指向同一个对象。
这就是为什么当您查看列表时会获得最后一个对象的值(因为实际上只有)。
我猜你真正想做的是将栏中的每个项目 (foo) 添加到CheckedListBox
.如果是这样,请使用这个。
foreach (string foo in bar)
{
foo.code += ".";
foo.path += ".";
Console.WriteLine(foo);
clbFooBar.Items.Add(foo);
}