Satır eklemeye çalışırken bu Satır zaten başka bir tablo hatasına mi ait?


197

Bazı satırları olan bir DataTable var ve ben sonra foreach kullanarak döngü ve başka bir DataTable eklemek döngü DataRows bir koleksiyon almak için satırları süzmek için seçin kullanıyorum, ama bana hata veriyor "Bu Satır zaten ait msgstr "başka bir tabloya gönder". İşte kod:

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.Rows.Add(dr); //Error thrown here.
}

1
büyük soru; Diğer kaplara ait satırlar ve tablolar hakkında kafam karıştı
Vivian River

Yanıtlar:


339

İlk Rowdeğerlerden yeni bir tane oluşturmanız gerekir dr. A DataRowsadece bir tanesine ait olabilir DataTable.

Bir Adddeğer dizisi alan da kullanabilirsiniz :

myTable.Rows.Add(dr.ItemArray)

Ya da daha da iyisi:

// This works because the row was added to the original table.
myTable.ImportRow(dr);

// The following won't work. No data will be added or exception thrown.
var drFail = dt.NewRow()
drFail["CustomerID"] = "[Your data here]";
// dt.Rows.Add(row); // Uncomment for import to succeed.
myTable.ImportRow(drFail);

6
ImportRow'u uyarıcı olarak kullanabilir miyim? ve neden .NET yalnızca farklı DataTable'lar için aynı DataRow'a sahip olmanıza izin vermiyor? Tasarım gereği bu mu?
Xaisoft

3
Heh henüz ImportRow'u fark ettim, cevabımı düzenle ve hepiniz beni dövüyorsunuz. Ama evet bu yaklaşımı sizin için satırı kopyalayacağı için tavsiye ederim
JoshBerke

2
ImportRowbenim için çalışıyorum. Ancak Satır Ekle! Thanksssssssssss
nawfal

1
İçe aktardığınız satır, kaynak tablodaki satıra bir başvuru ise ImportRow çalışmaz. Kaynak satırı kullanırsanız ItemArray çalışır, ancak satırı kaynaktan kaldırmadan önce satırı hedefe eklemeyi unutmayın, aksi takdirde satır kaldırıldığından ve verileri bulamadığından şikayet eder.
Adam Houldsworth

2
.ImportRow()benim için çalışmadı çünkü .Clone()başlangıçta yeni DataTable'ımda sütun oluşturmadım ya da sütun oluşturmadım. .Rows.CountYeni masama baktığımda 0 oldu . Masamda sütunlar oluşturup eklemem gerektiğinden, bir NewRow()ifade oluşturdum ve değerlerimi doğrudan bu yeni satırdaki sütunlara ekledim ve bu satırı döngü içinde tabloma ekledim (aşağıdaki cevabıma bakın) .
vapcguy

34

Bunu dene:

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = dt.Clone();

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.ImportRow(dr);
}

3
Bunun için teşekkür ederim .. @JoshBerke tarafından verilen cevap doğru olmasına rağmen orijinal tabloyu çalışması için örnekte olduğu gibi klonlamanız gerekir.
carny666

8
yourTable.ImportRow(dataRow);

Çünkü kopyaladığınız satır aynı değil TableName:

Örneğin, şunu deneyin:

Table1.TableName = "Table1";
Table2.TableName = "Table2";

1
Ben de isimsiz bir masa vardı. Teşekkürler!
Bruno

3
foreach (DataRow dr in dtSpecificOrders.rows)
{
   dtSpecificOrders.Rows.Add(dr.ItemArray); 
}

1
Yinelediğiniz şekilde, yinelediğiniz gibi bir şey ekleyebileceğinizi düşünmüyorum.
vapcguy

3

Bu en temiz / en hızlı / en kolay / en zarif çözüm değil, ancak işi benzer bir senaryoda yapmak için yarattığım kaba bir güçtür:

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

// Create new DataColumns for dtSpecificOrders that are the same as in "dt"
DataColumn dcID = new DataColumn("ID", typeof(int));
DataColumn dcName = new DataColumn("Name", typeof(string));
dtSpecificOrders.Columns.Add(dtID);
dtSpecificOrders.Columns.Add(dcName);

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    DataRow myRow = dtSpecificOrders.NewRow();  // <-- create a brand-new row
    myRow[dcID] = int.Parse(dr["ID"]);
    myRow[dcName] = dr["Name"].ToString();
    dtSpecificOrders.Rows.Add(myRow);   // <-- this will add the new row
}

DataColumns'taki adların çalışması için orijinal tablonuzdakilerle eşleşmesi gerekir. Ben sadece örnek olarak "ID" ve "Name" kullandım.


1

Neden sadece kullanmıyorsun CopyToDataTable

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();

1
OrderRows'ın burada olması gerekiyor mu?
Avi

Avi'den seçilen satırların yeni bir DataTable'ı dt.
vapcguy

0

sütunlara bir miktar kimlik verebilir ve benzersiz bir şekilde adlandırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.