0

私のアプリでは、データベースから3行のデータを取得し、データの行をループしてデータを顧客オブジェクトに割り当ててから、顧客を顧客コレクションに追加します。

// new customer object to fill in loop and assign to collection
tracker.Customer myCustomer = new tracker.Customer();

// new customer collection object to fill later
Tracker.customerCollection  myCustomerCollection = new trackerCustomerCollection();

foreach (System.Data.DataRow drRow in dsResults.Tables[0].Rows) 
{
  myCustomer.CustomerID = Item["CustomerID"];
  myCustomer.FKBandID = Convert.ToInt32(drRow["FKBandID"]);
  myCustomer.FKSectorID = Convert.ToInt32(drRow["FKSectorID"]); 
  myCustomer.CustomerName = Convert.ToString(drRow["CustomerName"]);
  myCustomer.CustomerAddress = Convert.ToString(drRow["CustomerAddress"]);
  myCustomer.CustomerPhoneNumber = Convert.ToString(drRow["CustomerPhoneNumber"]);

  myCustomerCollection.Add(myCustomer);
}

問題は、入力されたを使用しようとすると、コレクション内のmyCustomerCollection3つのオブジェクトがすべて同一であるということです。Customerの各インスタンスはmyCustomer、ループを反復処理するときに異なりますが、に追加されると変更されmyCustomerCollectionます。各アイテムは、最後に追加されたアイテムと同じになります。

誰かが私を正しい方向に向けることができれば、私は非常に感謝しています。私はこの原則をVB.NETで問題なく使用しましたが、C#を使用せざるを得なくなり、問題の原因を見つけるのに本当に苦労しています。

4

2 に答える 2

2

これは、Customerオブジェクトのインスタンスを1つ作成し、それをリストに3回追加しているためです(ループするたびに変更します)。

new tracker.Customer()ループ内を移動すると、3つの個別の顧客オブジェクトが作成されます。

于 2013-01-04T14:31:27.373 に答える
1

tracker.Customerループ外の単一のインスタンスではなく、forループの各反復で新しいものを作成する必要があります。

foreach (var drRow in dsResults.Tables[0].Rows) 
{
    // Create a brand new instance of a customer and set its properties
    var myCustomer = new tracker.Customer()
    {
        CustomerID = Item["CustomerID"];
        FKBandID = Convert.ToInt32(drRow["FKBandID"]);
        FKSectorID = Convert.ToInt32(drRow["FKSectorID"]); 
        CustomerName = Convert.ToString(drRow["CustomerName"]);
        CustomerAddress = Convert.ToString(drRow["CustomerAddress"]);
        CustomerPhoneNumber = Convert.ToString(drRow["CustomerPhoneNumber"])
    };
    // Add your new customer to the customer collection
    myCustomerCollection.Add(myCustomer);
}

現在起こっていることは、データベース内のレコードごとに1つをインスタンス化していないためmyCustomerCollection、同じmyCustomerインスタンスへの3つの参照が含まれていることです。new現在表示されている値は、myCustomerおそらくデータの最後の行に関連しています。

forループの各反復で新しいインスタンスを作成することにより、リストに3つの異なるtracker.Customerオブジェクトが含まれるようになります。

この動作は、VB.NETでもまったく同じです。

于 2013-01-04T14:28:58.947 に答える