在C#中向自选列表框添加自定义对象

时间:2016-07-06 13:45:26

标签: c# winforms checkedlistbox

我有一个存储两个字符串的对象并覆盖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()),基础进程正在进行的是什么& #39; t立刻明显吗?

如果我将其更改为clbFooBar.Items.Add(temp.ToString());,它的效果绝对正常,但不会与temp.ToString.ToString()相同,因为.Add首先调用.ToString() ?我认为控制台打印和.Add的行为相同,因为它们都会调用ToString()

编辑:temp = new fooBar();是解决我的问题的方法,我只是想知道为什么当直觉导致我认为覆盖两个字符串,代码和路径时,这就是解决方案,应该足够了,为什么没有这个重新初始化,选中列表框中的所有项目都是相同的。

2 个答案:

答案 0 :(得分:3)

因此,如果您保持行

,那么您的问题似乎就是您的代码正常工作的原因
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);
}

答案 1 :(得分:0)

您正在temp循环之外创建foreach,然后在其中初始化。

如果你没有重新初始化循环,你最终得到的是CheckedListBox,其中的所有项目都指向同一个对象。

这就是为什么当你查看列表时你得到最后一个对象的值(因为实际上只有)。

我猜你真正想要做的是将每个项目(foo)添加到CheckedListBox栏中。如果是这样,请使用它。

        foreach (string foo in bar)
        {
            foo.code += ".";
            foo.path += ".";

            Console.WriteLine(foo);
            clbFooBar.Items.Add(foo);
        }