Baris ini sudah menjadi kesalahan tabel lain ketika mencoba menambahkan baris?


197

Saya memiliki DataTable yang memiliki beberapa baris dan saya menggunakan pilih untuk memfilter baris untuk mendapatkan koleksi DataRows yang kemudian saya lewati menggunakan foreach dan menambahkannya ke DataTable lain, tetapi itu memberi saya kesalahan "Baris ini sudah menjadi milik ke meja lain ". Ini kodenya:

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
pertanyaan bagus; Saya bingung tentang baris dan meja milik wadah lain
Sungai Vivian

Jawaban:


339

Anda harus membuat yang baru Rowdengan nilai dari drpertama. A DataRowhanya bisa menjadi milik satu DataTable.

Anda juga dapat menggunakan Addyang mengambil array nilai:

myTable.Rows.Add(dr.ItemArray)

Atau mungkin lebih baik:

// 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
Bisakah saya menggunakan ImportRow sebagai alernatif? dan mengapa .NET hanya tidak memungkinkan Anda untuk memiliki DataRow yang sama untuk DataTables yang berbeda? Apakah ini berdasarkan desain?
Xaisoft

3
Heh saya baru saja menyadari ImportRow, edit jawaban saya dan Anda semua mengalahkan saya untuk itu. Tapi ya saya akan merekomendasikan pendekatan itu karena akan menyalin baris untuk Anda
JoshBerke

2
ImportRowdin bekerja untukku. Tapi Tambah Baris lakukan! Thanksssssssssss
nawfal

1
ImportRow tidak akan berfungsi jika baris yang Anda impor adalah referensi ke baris di tabel sumber. ItemArray berfungsi jika Anda menggunakan baris sumber, tetapi Anda harus ingat untuk menambahkan baris ke tujuan sebelum Anda menghapus baris dari sumber, jika tidak maka mengeluh baris telah dihapus dan tidak dapat menemukan data.
Adam Houldsworth

2
.ImportRow()tidak berfungsi untuk saya karena saya tidak melakukan .Clone()atau membuat kolom pada DataTable baru saya, pada awalnya. Itu muncul dengan 0 ketika saya melihat di .Rows.Countmeja baru saya. Karena saya akan perlu membuat kolom di meja saya dan menambahkannya, saya baru saja membuat NewRow()pernyataan dan menambahkan nilai-nilai saya ke kolom pada baris baru secara langsung dan menambahkan baris itu ke meja saya, dalam loop (lihat jawaban saya di bawah) .
vapcguy

34

Coba ini:

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

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

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

3
Terima kasih untuk ini .. walaupun jawaban yang diberikan oleh @JoshBerke benar, Anda perlu mengkloning tabel asli seperti pada contoh Anda agar bisa berfungsi.
carny666

8
yourTable.ImportRow(dataRow);

Itu karena baris yang Anda salin tidak memiliki yang sama TableName:

Misalnya, coba:

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

1
Saya punya meja yang salah nama juga. Terima kasih!
Bruno

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

1
Saya tidak berpikir Anda dapat menambahkan apa pun ke apa yang Anda iterasi, karena Anda iterasi melalui itu.
vapcguy

3

Ini bukan solusi terbersih / tercepat / termudah / paling elegan, tapi ini adalah solusi yang saya buat untuk menyelesaikan pekerjaan dalam skenario yang sama:

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
}

Nama-nama dalam Kolom Data harus cocok dengan yang ada di tabel asli Anda agar berfungsi. Saya hanya menggunakan "ID" dan "Name" sebagai contoh.


1

Kenapa tidak Anda gunakan saja CopyToDataTable

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

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

1
Apa seharusnya orderRows di sini?
Avi

DataTable baru dari baris yang dipilih dari dt, Avi.
vapcguy

0

Anda dapat memberikan beberapa id ke kolom dan beri nama secara unik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.