将自定义对象添加到 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();是我问题的解决方法,我只想知道为什么这是修复程序,当直觉使我认为覆盖两个字符串,代码和路径应该足够了,以及为什么没有这种重新初始化,选中列表框中的所有项目都是相同的。

将自定义对象添加到 C# 中的选中列表框

所以你的问题似乎是为什么你的代码工作正常,如果你保持行

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);
}

每次迭代都有一个新实例,并且不会更改已添加的实例。


更新:刚刚注意到它们看起来仍然与您将它们全部设置为codetemp的任何默认值以及"."一样。所以现在还不清楚你到底想做什么。 也许是这样的:

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);
        }