2014-02-05 36 views
0

我的foreach循環出現問題。 prupose是循環訪問列表框中的項目,對於每個項目,都應該設置該人員的屬性等於該人員的屬性等於我將插入到人員列表中的一個人員對象(該人員有一個項目,與物業等..)。問題:它將第一個包含它的項目的人插入列表中,但是當涉及到要插入的第二個人時,它會將第一個人數據更改爲與第二個人數據相同的數據,並插入第二個人。所以它總是插入新的人,但是改變我插入的所有舊數據也與新人相同。我的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; 

它應該在列表框中的所有項目添加到列表中的下一條語句,併爲每個項目應該加人詳細介紹了。

     PersonItemsList.Add(PersonItemObject); 

如果我增加了超過1項,它改變了我,我在列表中添加是一樣的,然後新的人的數據舊數據,並插入一個新的人進入榜單也一個人。

    } 
       DialogResult = DialogResult.OK; 
       Close(); 

      } 
     } 
+0

'PersonItemObject'定義在哪裏? –

+0

這是因爲您每次添加相同的'PersonItemObject'參考,您需要在循環的每次迭代中創建一個新的'PersonItemObject'。 – James

回答

1

在每個迭代要更新的同一個對象的屬性,然後將其插入到列表中。所以在最後的列表中,同一對象包含多個引用。

你應該做的是craeting新對象每次迭代:

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

您應該創建 「PersonItemObject」 的新實例。喜歡的東西:

PersonItemObject = new PersonItemObjectClass() 

爲你的循環的第一句話,是PersonItemObjectClass PersonItemObject類型的。這裏的問題可能是,你總是使用相同的實例,因爲它的值總是在變化。

1

您必須在foreach循環內創建任何類型的新實例PersonItemObject

你添加到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之間的差異。

0

你有一個PersonItemObject和你在每一個改變它iteration.If你想PersonItemObjects的名單,然後創建一個新的實例在每次迭代中:

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

Thanx很多,所有的答案幫助!現在正在工作 – user2980509

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