質問

なぜこのコードが機能しないのか理解できません。

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}
役に立ちましたか?

解決

それでも DataRow.Delete コレクションの状態は変更されません。 Microsoft のドキュメント コレクションの反復中にそれを呼び出すべきではないと述べています。

DataRowCollection オブジェクトを反復処理する際には、foreach ループ内で Delete と Remove を呼び出さないでください。[削除] または [削除] は、コレクションの状態を変更します。

通常、最善の解決策は、別のコレクションを作成することです (例:ある List<DataRow>) を選択して削除します。 反復が完了しました。

これは、コレクションから項目を削除したい場合の解決策でもあります。これは、.NET のほとんどのコレクションでは、反復処理中にコレクションの内容を変更することができないためです。

他のヒント

最も安全な方法 - 使用forループ

for (int i = datatable.Rows.Count - 1; i >= 0; i--) 
{
    if (true)
    {
        datatable.Rows[i].Delete();
    }
}

AcceptChanges のに忘れてはいけません

:すべてのマークされた行を削除します
datatable.AcceptChanges();

あなたはforeach文を使用して、その上に反復している間、あなたは、コレクションを変更することはできません。

あなたがそのような何かを試すことができます:

List<DataRow> deletedRows = new List<DataRow>();

foreach (DataRow dataRow in dataTable.Rows)
{
    if(true) deletedRows.Add(dataRow);
}

foreach(DataRow dataRow in deletedRows)
{
    dataRow.Delete();
}

あなたはdeleteメソッドを呼び出した場合、あなただけのforeachループの後に、あなたが変更しているテーブルの上にAcceptChanges()を呼び出す必要があります。

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}

dataTable.AcceptChanges();

削除方法は、単にマーク削除対象の行を

ます。http: //msdn.microsoft.com/en-us/library/system.data.datarow.delete%28v=VS.90%29.aspxする

私の答えは長くない有用である可能性があります。 DataRowを持つforeachの中の例外スローのみ.NET 2.0に表示され、それ以前の、その理由は、MSDNの説明です ます。http:// MSDN。 microsoft.com/en-us/library/system.data.datarow.delete(v=vs.80).aspxする

行のRowStateが追加された場合、

、行がテーブルから削除されます。

あなたはDeleteメソッドを使用した後、

RowStateが削除さになります。あなたがれるAcceptChangesを呼び出すまでは削除されたままになります。

Aは、行がRejectChangesを呼び出すことによって削除を取り消すことができる削除

この問題を渡すために、あなたはforeachの

を使用する前に)(DataTable.AcceptChangesを呼び出すことができます
foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}

dataTable.AcceptChanges();

動作を理解するにはスナップを参照してください。

  1. 削除されただけですが、DataTable からは削除されていません。

enter image description here

  1. AcceptChanges() 関数の前のブレークポイント。enter image description here
  2. AcceptChanges() 関数の実行後。enter image description here

この問題が解決されることを願っています。

Rowsの内容は、あなたが繰り返し無効をレンダリングする1行を、削除する場合は、反復処理をしている間に変更ます。

あなたは、しかし、最初のコレクションに行をコピーして、コレクションを反復処理し、道という行を削除することができます。これは、反復が反復されるデータを変更することによって中断されていないことを確認します。

あなたはDataTableの反復の外に削除して、削除行したい行をマップするためにリストを使用することによって、これを達成するための最も簡単な方法。

C#

    List<DataRow> rowsWantToDelete= new List<DataRow>();

    foreach (DataRow dr in dt.Rows)
    {
        if(/*Your condition*/)
        {
            rowsWantToDelete.Add(dr);
        }
    }

    foreach(DataRow dr in rowsWantToDelete)
    {
        dt.Rows.Remove(dr);
    }

VB

Dim rowsWantToDelete As New List(Of DataRow)

For Each dr As DataRow In dt
    If 'Your condition' Then
        rowsWantToDelete .Add(dr)
    End If
Next

For Each dr As DataRow In rowsWantToDelete 
    dt.Rows.Remove(dr)
Next

私はちょうど使用したもの、それの他のバージョン(私が簡単だと思うが)あります

int i=0;
while (i < myDataTable.Rows.Count)
{
    if (condition)  //should it be deleted?
        myDataTable.Rows.RemoveAt(i);
    else
        i++;
}

この速くます。

私だけのような特定のシナリオを探している人のために、 私は、削除済みとしてマークすることによって行を除外し、時間を短縮するのに必要な、そしていくつかの有用なINFOMATION各行から抽出された後

・ホープ、このヘルプ誰か...

foreach (DataRow dataRow in dataTable.Rows)
{
    if (dataRow.RowState != DataRowState.Deleted)
    {
        if (your condition here)
        {
            dataRow.Delete();
        }
    }
}

これはかなり上の任意のコレクションに適用されます。あなたは、コレクションをループしながら、アイテムを削除しようとすると、問題があります。たとえば、あなたは、削除行#3、その後、前の行#4は、行#3になります。

アイテムがCountを持っている場合は、

は、これは私がやっていることです。

int Count = myTable.Rows.Count;

while (Count > 0) // replace condition with myTable.Rows.Count if unconditionally performed on all rows
{
    DataRow row = myTable.Rows[0] // or however you want to find your index

    // do some work
    myTable.Rows.Remove(row);

    // if you want to perform a check to break out of while
    if (someCondition)
        Count = 0;
    else
        Count = myTable.Rows.Count;
}
オブジェクトは.GetXXXX()(IIRC)のようなFileInfoコレクションを有すること

注、 foreachの項目の内容を削除することは許容されます。私が考えた一つの解決策は、.GetItems()方法を提供拡張メソッドを作成しています。

使用この:

for (int i = 0; i < myDataTable.Rows.Count; i++)

{

 myDataTable[i].Delete();

}
それはあなたが登ること階段の階段を分解してみてくださいように見えるので、

このです。単純に、あなたはあなたの反復を項目を削除することはできません。

そのため、あなたが反復処理し、データテーブルRowsプロパティからそれらを削除するには別のアレイを使用する必要があります。

foreach (DataRow dataRow in dataTable.Select())
{
    if (true)
    {
        dataTable.Rows.Remove(dataRow);
    }
}

確かにMagents

これは私がそれをやったし、罰金をどのように動作するかです。

dt = GetStationeryConsolidationDetails(txtRefNo.Text);
int intRows = dt.Rows.Count;
int x = 0;
for (int c = 0; c < intRows; c++)
{
  if (dt.Rows[c - x]["DQTY"].ToString() == "0")
  {
    dt.Rows[c - x].Delete();
    dt.AcceptChanges();
    x++;        
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top