我的foreach错误是什么?

时间:2014-02-05 14:54:14

标签: c# sqlite loops foreach listbox

我的foreach循环有问题。这个目的是循环遍历列表框中的项目,对于每个项目,它应该将人员的属性设置为等于人物的属性等于我将插入人员列表中的人物对象。有一个项目,具有属性等。)。问题:它将第一个人的项目插入到列表中,但当涉及到它必须插入的第二个人时,它将第一个人数据更改为与第二个人数据相同的数据,并插入第二个人。因此,它总是插入新人,但是我已经插入的所有旧数据也与新人的数据相同。

private void btnOK_Click(object sender, EventArgs e)
        {
            bool bOK = false;

            if (UC.IsEmpty(txtFirstName) || UC.IsEmpty(txtLastName) || UC.IsEmpty(txtID) || lstItemsAdded.Text == null) //Maak seker van die listItemsAdded se content... hier sal n error wees... j kan nog n else maak dat hy spesefiek toets of daar items in die lstbox is
            {
                UC.MB("Customer Information Missing", "Please supply enough customer information");
            }
            else
            {
                bOK = true;
            }
            if (bOK) 
            {

                foreach (Item item in lstItemsAdded.Items)
                {
                        PersonItemObject.FirstName = txtFirstName.Text;
                        PersonItemObject.LastName = txtLastName.Text;
                        PersonItemObject.ID = txtID.Text;
                        PersonItemObject.Email = txtEmail.Text;
                        PersonItemObject.Age = Convert.ToInt32(txtAge.Text);

                        PersonItemObject.Item.ItemCode = item.ItemCode;
                        PersonItemObject.Item.ItemDescription = item.ItemDescription;
                        PersonItemObject.Item.ItemName = item.ItemName;
                        PersonItemObject.Item.ItemPrice = item.ItemPrice;

应该将listBox中的所有项目添加到下一个语句中的列表中,并且对于每个项目,它也应该添加人员详细信息。

                        PersonItemsList.Add(PersonItemObject);

如果我向一个人添加了多个项目,它会将我在列表中添加的旧数据更改为与新人员数据相同,并将新人员插入到列表中。

                    }
                DialogResult = DialogResult.OK;
                Close();

            }
        }

6 个答案:

答案 0 :(得分:1)

您应该创建“ PersonItemObject ”的新实例。类似的东西:

PersonItemObject = new PersonItemObjectClass()

作为循环的第一句,是 PersonItemObjectClass PersonItemObject 的类型。这里的问题可能是,你总是使用相同的实例,因此它的值总是在变化。

答案 1 :(得分:1)

您必须在PersonItemObject循环内创建foreach类型的新实例。

您要添加到PersonItemsList的内容实际上是您的班级的单个实例的引用。每次迭代循环时,您都在更新同一个实例,因此您有一个相同的查找对象列表。

foreach (Item item in lstItemsAdded.Items)
{
    var PersonItemObject = new PersonItem();

    PersonItemObject.FirstName = txtFirstName.Text;
    PersonItemObject.LastName = txtLastName.Text;

    ...

    PersonItemsList.Add(PersonItemObject);
}

您可能想要了解value types and reference types之间的差异。

答案 2 :(得分:1)

在每次迭代中,您都要更新同一对象的属性,然后将其插入列表中。结尾列表中的SO包含对同一对象的几个引用。

您应该做的是为每次迭代推销新对象:

foreach (Item item in lstItemsAdded.Items)
{
    PersonItem item = new PersonItem(); //just guessing the type here
    item.FirstName = txtFirstName.Text;
    ...
    PersonItemsList.Add(item);
}

答案 3 :(得分:0)

你有一个PersonItemObject,你在每次迭代中都要更改它。如果你想创建一个PersonItemObjects列表,那么在每次迭代时创建一个新实例:

foreach (Item item in lstItemsAdded.Items)
{
    var PersonItemObject = new YourType();
    PersonItemObject.FirstName = txtFirstName.Text;
    PersonItemObject.LastName = txtLastName.Text;
    ...
}

答案 4 :(得分:0)

这种情况正在发生,因为您总是在更改相同的PersonItemObject。您应该每次都创建此对象的新版本并将其添加到列表中。

foreach (Item item in lstItemsAdded.Items)
{
    var newObject = new PersonItemObject();
    newObject.FirstName = txtFirstName.Text;
    newObject.LastName = txtLastName.Text;
    newObject.ID = txtID.Text;
    newObject.Email = txtEmail.Text;
    newObject.Age = Convert.ToInt32(txtAge.Text);

    newObject.Item.ItemCode = item.ItemCode;
    newObject.Item.ItemDescription = item.ItemDescription;
    newObject.Item.ItemName = item.ItemName;
    newObject.Item.ItemPrice = item.ItemPrice;

    PersonItemsList.Add(newObject);
}

答案 5 :(得分:0)

每次为其设置值时,都不会创建新对象。要创建一个新对象,正确的方法是这样的:

foreach (Item item in lstItemsAdded.Items)
{
    var newObject = new PersonItemObject()
    {
        FirstName = txtFirstName.Text;
        LastName = txtLastName.Text;
        ID = txtID.Text;
        Email = txtEmail.Text;
        Age = Convert.ToInt32(txtAge.Text);

        Item.ItemCode = item.ItemCode;
        Item.ItemDescription = item.ItemDescription;
        Item.ItemName = item.ItemName;
        Item.ItemPrice = item.ItemPrice;
    }
    PersonItemsList.Add(newObject);
}