2011-08-26 14 views
4
For Each Dr As DataRow In InvoiceDT.Rows 
    Dim DrResult As Array = PaymentInvoiceDT.Select("Amount='" & Dr("Amount").ToString() & "'") 
    If DrResult.Length > 0 Then 
     ''some code 
    Else 
     InvoiceDT.Rows.remove(Dr) 
    End If 
Next 

由於當您在數據表中更改某些內容時,其索引發生更改,因此發生錯誤。如何在數據表上循環時刪除行

回答

10

,因爲當你刪除的東西,收集已發生變化,你無法一一列舉下去了,您將無法做到這一點的For 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

你的代碼是正確的。但是當我們使用它時,它會以降序顯示數據 –

+0

如果這樣做,您可以很容易地反轉訂單後,以解決它。 :)還記得如果一個帖子回答你的問題,使用複選標記將其標記爲答案。這會鼓勵更多的人在以後幫助你。 :) – Tridus

+0

我該如何反轉訂單?無循環 –

-2

您不能使用簡單的DELETE語句刪除嗎?

DELETE FROM xxx WHERE Amount = yyy

4

Sai,它失敗了,因爲在所有錶行中循環時都不應真正刪除行。

的你可以做什麼,在C#中的例子是這樣的一個:

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); 
    } 

所以你看你第一次選擇所有的行與LINQ刪除,那麼你僅環上生成的行並將其從源表。

抱歉沒有時間在VB.NET中寫這個,但這個想法應該是明確的,我希望。

+0

這不起作用。拋出一個「集合無法修改」錯誤 –

+0

嗨Ajit,不是真的,因爲我們在數組上循環,但我們從表中刪除,至少在2011年8月,當我發佈這個答案時,它工作。 –

+0

你可能是對的,我錯過了創建一個新實例的ToArray()部分。 Stackoverflow不允許我提出答案。 –

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