2011-08-26 3 views

답변

10

당신은 Each 루프에서이 작업을 수행 할 수 없습니다.

필요한 것은 반전 된 For 루프입니다.

For i as Integer = Invoice.Rows.Count -1 to 0 Step -1 
    Dim DrResult As Array = PaymentInvoiceDT.Select("Amount='" & Invoice.Rows(i).("Amount").ToString() & "'") 
    If DrResult.Length > 0 Then 
     'some code 
    Else 
     InvoiceDT.Rows.remove(InvoiceDT.Rows(i)) 
    End If 
Next 

당신이 그들의 인덱스를 가지고 있지 접촉하지 않는 사람이 변경 때문에 당신이 행을 제거하고 열거를 사용하지 않기 때문에이 경우에도 여전히 작동합니다.

+0

ur 코드가 맞습니다. 하지만 이것을 사용하면 데이터가 내림차순으로 표시됩니다 ( –

+0

). 그렇게하면 나중에 쉽게 수정할 수 있습니다. :) 또한 게시물이 귀하의 질문에 대한 답을 표시하도록 체크 표시를 사용하면 기억하십시오. 그러면 나중에 더 많은 사람들이 당신을 도울 수 있습니다. :) – Tridus

+0

어떻게 순서를 바꿀 수 있습니까? 루프 없음 –

-2

간단한 DELETE 문을 사용하여 삭제할 수 없습니까? 당신이 뭔가를 제거 할 때, 컬렉션이 변경 당신은 더 이상 열거 할 수 없기 때문에

DELETE FROM xxx WHERE Amount = yyy

4

Sai, 모든 테이블 행을 루핑하는 동안 실제로 행을 삭제해서는 안되기 때문에 실패합니다. 당신은 당신이 처음에만 결과 행에 LINQ와 함께 다음 루프를 삭제하는 모든 행을 선택하고 그들을 제거를 참조 정도로

DataTable dt = CreateDataSource(); 

    DataRow[] rows = (from t in dt.AsEnumerable().Cast<DataRow>() 
         where t.Field<int>("ID") == 1 
         select t).ToArray(); 

    foreach (DataRow row in rows) 
    { 
     dt.Rows.Remove(row); 
    } 

:

당신이 C#으로, 무엇을 할 수 있는지의 예는 이쪽 소스 테이블

죄송합니다. VB.NET에서이 글을 쓸 시간이 없지만 아이디어가 분명해야합니다.

+0

이것은 작동하지 않습니다. "컬렉션을 수정할 수 없습니다."오류가 발생합니다 –

+0

안녕하세요, 배열에 루프가 있지만 테이블에서 삭제할 때 true가 아니라 적어도이 답변을 게시 한 2011 년 8 월에 작동했습니다. –

+0

당신이 맞을 수도 있습니다, 나는 새로운 인스턴스를 생성하는 ToArray() 부분을 놓쳤습니다. Stackoverflow 내가 대답을 upvote 허용하지 않습니다. –

1

제 문제는 테이블을 여러 번 반복해야하므로 첫 번째 라운드에서 행을 삭제 한 후에 이전에 삭제 된 행의 인덱스로 이동할 때 예외가 발생한다는 것입니다. 테이블을 복제하고 보관하고 싶은 행을 복사하는 결과가 발생했습니다.

Dim NewInvoiceDT as DataTable = InvoiceDT.clone 
For Each Dr As DataRow In InvoiceDT.Rows 
    If 'some statement 
     Dim NewDr as DataRow = NewInvoiceDT.Rows.Add 
     NewDr.ItemArray = Dr.ItemArray 
    End if 
Next 
관련 문제