2011-02-09 16 views
0

私はDataRowCollection.Add(DataRow行)が新しい行をそのデータテーブルに挿入する場所を把握しようとしています。それはテーブルの最後にありますか?ランダムですか?DataRowCollection.Addメソッドはどこに新しい行を挿入しますか?

また、私はデータテーブルをループする際にこれを使用したいと思います。いくつかの条件が存在する場合は、異なるデータを含む新しい行を追加して、Forループを介してデータテーブルの末尾まで実行します。このアプローチに特有の問題はありますか?それ以外はどうすればいいですか?

EDIT:私はメモリに格納された.Net DataTABLEをループしています。このループ操作中に元のデータが格納されているdataBASEには触れていません。 DataTABLEにはループの前にデータが設定されているため、問題はありません。ここで

はrelavantコードです:

DataTable machineANDlastDate = new DataTable(); 
//Populate machineANDlastDate 

for (int i = 0; i < machineANDlastDate.Rows.Count; i++) 
{ 
    lastFutureDate = DateTime.Parse(machineANDlastDate.Rows[i]["MaxDueDate"].ToString()); 
    newDateTime = lastFutureDate.AddDays(frequency); //This is where the new date is created. 
    machineSerial = machineANDlastDate.Rows[i]["machineSerial"].ToString(); 

    if (newDateTime < DateTime.Now) 
    { 
      machineANDlastDate.Rows.Add(new String[] { machineSerial,   newDateTime.AddDays(frequency).ToString() }); 

      continue; 
    } 
    ...Removed for irrelevancy... 
} 

が、これはデータテーブルの最後に行を追加するための有効な方法は何ですか?

+1

ハッシュでない限り、追加は最後になります – Alex

+0

ハッシュとは何ですか? – MAW74656

+0

ハッシュは、キー/値がある場所でより一般的です。キーはハッシュされているため、値の検索は高速です。 – jlafay

答えて

2

私が知る限り、それは常にコレクションの最後に追加されます。

forデータベースをループする場合は、データテーブルの先頭から始めて、それに類似するsmthの最後で終了すると問題はありません。しかし、新しく作成されたデータ行もループしますが、これを実現するかどうかはわかりません。 foreachループを使用すると問題が発生するのは、基本となるコレクションの変更を処理できないためです。

+0

はい、私は新しいアイテムをループしたい、そのポイントです。特定の条件が存在する場合、そのデータを変更してから、ループを介して変更されたバージョンを実行します。私は基本的な接続でforeachループの問題を認識しているので、Forループにこの問題はないと言っていますか? – MAW74656

+0

アイテムを削除しないと、条件があらかじめ有効であれば問題はないと思います。 'for'と' foreach'の2つのループの重要な違いは 'for'ループの索引付けにあります。そこでインデックスを扱うので、 'foreach'ループの問題を避けることができます。希望が役立ちます。 –

+0

DataTableのRows.Countメソッドを制限として使用するのはどうですか?それは各ループ反復で更新されますか? – MAW74656

0

データベースの大部分がわかっている限り、常にテーブルの最後にあります。追加行を使用している場合は、常に最後です。

+0

私はここでデータベースコネクタを扱っていません。 – MAW74656

-3

Addメソッドは、DataRowDataRowCollectionオブジェクトにのみ挿入します。実際にDataRowをデータテーブルに追加するには、メソッドを呼び出してDataTableに追加し、そのデータベースのテーブルにその行を追加する必要があります。参照するには、http://msdn.microsoft.com/en-us/library/9yfsd47w.aspx

+0

いいえ、まったく逆です。 'NewRow'メソッドを使って新しい行を作成しなければなりません。その後、' Add'メソッドを使ってそれをデータテーブルに追加する必要があります。 DataTableは、DataRowCollectionによって表されています。 –

+0

DataTableには、DataRowCollection(DataTable HASとDataRowCollection)が含まれています。関連またはリンクされていない、DataTableは、DataRowCollectionを含む多くの他のオブジェクトの構成です。 – MAW74656

+0

NewRowメソッドは、テーブルと同じ列構造を持つ行インスタンスを返します。これにより、インデクサを使用して列単位でセルを参照することができます。それでもデータが入力されると、テーブルに行を追加する必要があります。 –

1

行が新しいかどうかを知りたい場合は、DataRow.RowStateプロパティを確認してください。

// your code to add rows 
... 

// process added rows 
foreach (DataRow row in machineANDlastDate.Rows) 
{ 
    if (row.RowState == DataRowState.Added) 
    { 
     // do stuff 
    } 
} 

// now confirm new rows (they won't have a RowState of Added after this) 
machineANDlastDate.AcceptChanges(); 
+0

私はこのAcceptChanges()メソッドには慣れていませんが、どこから行が出るのかとは関係ありません。ループが到着したときにそれを処理したいだけです。 – MAW74656

+0

AcceptChangesは、すべての行のRowStateを未変更に変更します。行を追加すると、追加されたRowStateで始まります。これを使用して、新しい行のみを処理できます。完了したら、再処理する必要があり、同じ行を再度処理したくない場合にのみ、AcceptChangesを呼び出す必要があります。 –

関連する問題