0

gridview以下に示すように、 a の値をリストに書き込むコードをいくつか示します。コードは正しい値を取得しますが、グリッドの 2 行目がリストに追加されると、リストの最初の行が上書きされます。
なぜこれが起こっているのか知っている人はいますか?

C# コード

 List<Item> lstNewItems = new List<Item>(); // Control Items  
 lstNewItems.Clear();
 Item NewItem = new Item();
 foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows)
 {
    NewItem.Paramater = PendingItemUnderControl.Cells[0].Text.ToLower();
    NewItem.Type = (String)Session["BrowseType"];
    lstNewItems.Add(NewItem);
 }
4

3 に答える 3

7

Itemクラスのインスタンスを 1 つ作成しています。ループの前に発生するため、実際には同じオブジェクトで作業しています。ループ内で (各反復で) 新しいインスタンスを作成する必要があります。

List<Item> lstNewItems = new List<Item>(); // Control Items  
lstNewItems.Clear();

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows)
{
    Item NewItem = new Item();
    NewItem.Paramater = PendingItemUnderControl.Cells[0].Text.ToLower();
    NewItem.Type = (String)Session["BrowseType"];
    lstNewItems.Add(NewItem);
}
于 2012-12-01T12:09:07.937 に答える
3

これは、同じオブジェクトを追加し続け、ループの反復ごとに変更するためです。

一度だけ割り当てNewItemてから、構成してリストに追加します。ただし、アイテムがリストにある場合は、それを再構成して、2 回目にリストに追加します。これで、最後のアイテムとして構成された 2 つのアイテムができました。次に、それを 3 番目の項目として構成し、再度追加します。ただし、3 つの項目はすべて同じように構成されています。前の 2 つのパラメーターとタイプはなくなりました。ループが終了すると、リスト内の同じ最後の項目のN コピーが作成されます。

をループ内に移動しnewて問題を解決します。

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows)
{
    Item NewItem = new Item();
    ....
}

さらに良いことに、Item immutableを作成し、コンストラクターでパラメーターを渡します。

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows)
{
    lstNewItems.Add(new Item(
        PendingItemUnderControl.Cells[0].Text.ToLower()
    ,   (String)Session["BrowseType"])
    );
}
于 2012-12-01T12:09:23.060 に答える
1

ループの外側で新しいものを作成しているItemため、毎回同じ要素を更新しています。

foreach (GridViewRow PendingItemUnderControl in GridViewPendingList.Rows)
{
    Item NewItem = new Item(); <------
    NewItem.Paramater = PendingItemUnderControl.Cells[0].Text.ToLower();
    NewItem.Type = (String)Session["BrowseType"];
    lstNewItems.Add(NewItem);

}

newをループに移動します

于 2012-12-01T12:09:50.840 に答える