이 행은 행을 추가하려고 할 때 이미 다른 테이블 오류에 속합니까?


197

일부 행이있는 DataTable이 있고 select를 사용하여 행을 필터링하여 DataRows 컬렉션을 가져 와서 foreach를 사용하여 반복하여 다른 DataTable에 추가하지만 "이 행은 이미 속합니다. 다른 테이블에 " 코드는 다음과 같습니다.

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
좋은 질문입니다. 다른 컨테이너에 속하는 행과 테이블에 대해 혼란스러워합니다
Vivian River

답변:


339

먼저 Row값 을 사용하여 새 것을 만들어야합니다 dr. A는 DataRow단 하나에 속할 수 있습니다 DataTable.

Add값 배열을 사용 하는 것을 사용할 수도 있습니다 .

myTable.Rows.Add(dr.ItemArray)

또는 아마도 더 나을 것입니다 :

// 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를 대체 용으로 사용할 수 있습니까? 그리고 왜 .NET이 다른 DataTable에 대해 동일한 DataRow를 가질 수 있도록 허용하지 않습니까? 의도적으로 설계된 것입니까?
Xaisoft

3
나는 방금 ImportRow를 깨달았고 내 대답을 편집하면 모두 나를 이겼다. 하지만 당신을 위해 행을 복사합니다으로 그 접근 방식을 권하고 싶습니다 참
JoshBerke

2
ImportRow나를 위해 일하십시오. 그러나 행 추가가 그랬습니다! Thanksssssssssss
nawfal

1
가져온 행이 소스 테이블의 행에 대한 참조 인 경우 ImportRow가 작동하지 않습니다. 소스 행을 사용하는 경우 ItemArray가 작동하지만 소스에서 행을 제거하기 전에 행을 대상에 추가해야합니다. 그렇지 않으면 행이 제거되었다고 불평하고 데이터를 찾을 수 없습니다.
Adam Houldsworth

2
.ImportRow().Clone()처음에는 새 DataTable에서 열을 만들거나 만들지 않았기 때문에 작동하지 않았습니다 . .Rows.Count새 테이블을 볼 때 0으로 나타났습니다 . 테이블에 열을 생성하고 추가해야하기 때문에 NewRow()문을 작성하고 값을 해당 새 행의 열에 직접 추가하고 해당 행을 루프 내 테이블에 추가했습니다 (아래 답변 참조). .
vapcguy

34

이 시도:

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

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

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

3
@JoshBerke가 제공 한 답변은 정확하지만 작동하려면 예제와 같이 원본 테이블을 복제해야합니다.
carny666

8
yourTable.ImportRow(dataRow);

복사하는 행이 같지 않기 때문입니다 TableName.

예를 들어 다음을 시도하십시오.

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

1
이름이 잘못된 테이블도있었습니다. 감사!
Bruno

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

1
반복 할 때 반복하는 것에 아무것도 추가 할 수 없다고 생각합니다.
vapcguy

3

이것은 가장 깨끗하고 / 빠른 / 가장 쉬운 / 가장 우아한 솔루션은 아니지만 비슷한 시나리오에서 작업을 수행하기 위해 만든 무차별 대입입니다.

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의 이름은 원래 테이블의 이름과 일치해야 작동합니다. 방금 "ID"와 "Name"을 예로 사용했습니다.


1

왜 그냥 사용하지 않습니까 CopyToDataTable

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

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

1
orderRows는 무엇입니까?
Avi

dtAvi 에서 선택한 행의 새 DataTable
vapcguy

0

열에 ID를 부여하고 고유하게 이름을 지정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.