DataRowCollectionクラス

プロパティ

プロパティ 内容
DataRow Item[Int32] 指定のインデックスにある行
int Count コレクション内のDataRowオブジェクトの総数
object SyncRoot コレクションの同期に使用するオブジェクト
     

Count

コレクション内のDataRowオブジェクトの総数であるため、RowStateがDeletedの行も含まれます。それを除外した総数を得たいならば、DataTable.Select().Lengthで得られます。一方そのDataTableがDataGridViewのDataSourceとされているならば、それのRowCountプロパティで表示されている行数を得られます。

DataTable table = new DataTable();
table.Columns.Add();

DataRowCollection rows = table.Rows;
rows.Add();
rows.Add();
table.AcceptChanges();
int r1 = rows.Count;            // 2
int s1 = table.Select().Length; // 2

rows[0].Delete(); // Deletedとなるだけで、コレクションから除去されていない
int r2 = rows.Count;            // 2
int s2 = table.Select().Length; // 1

rows[0].AcceptChanges(); // コレクションから除去される
int r3 = rows.Count;            // 1
int s3 = table.Select().Length; // 1

メソッド

メソッド 機能
Add(Object[]) 指定の値で新しい行を作成し、それをコレクションの末尾に追加できる
Add(DataRow) コレクションの末尾に、指定の行を追加できる
InsertAt(DataRow, Int32) コレクションの指定の位置に、指定の行を追加できる
Remove(DataRow) コレクションから、指定の行を除去できる
RemoveAt(Int32) コレクションから、指定のインデックスにある行を除去できる
Contains(Object) 指定の主キーが含まれているか確認できる
Find(Object) 指定の主キーが含まれている行を得られる
IndexOf(DataRow) 指定の行のインデックスを得られる
   
Methods - DataRowCollection Class (System.Data) | Microsoft Learn

Add()

指定の値で行を作成し、それをコレクションに追加できます。

public System.Data.DataRow Add (params object[] values);
Add(Object[]) - DataRowCollection.Add Method (System.Data) | Microsoft Learn

Add - DataRowCollection.cs

Remove()

public void Remove (System.Data.DataRow row);
DataRowCollection.Remove(DataRow) Method (System.Data) | Microsoft Learn

rowがDataRowCollectionから除去され、そのRowStateはDetachedになります。

内部的にはRowStateがDeletedやDetachedでなければDataRow.Delete()が呼ばれ、DetachedとなっていなければDataRow.AcceptChanges()が呼ばれDetachedとされます。Remove - DataRowCollection.cs

DataTable table = new DataTable("sample");
table.Columns.Add();

DataRow row = table.Rows.Add(1);
row.RowError = "ERROR";
table.AcceptChanges();

object[]     rowItems1     = row.ItemArray; // "1"
string       rowError1     = row.RowError;  // "ERROR"
DataRowState rowState1     = row.RowState;  // Unchanged
string       rowTableName1 = row.Table.TableName; // "sample"

table.Rows.Remove(row);

object[]     rowItems2     = row.ItemArray; // RowNotInTableException
string       rowError2     = row.RowError;  // "ERROR"
DataRowState rowState2     = row.RowState;  // Detached
string       rowTableName2 = row.Table.TableName; // "sample"

Relationが設定された子テーブルがあるならばその子行へも作用し、DetachedではなくDeletedとなります。

DataSet dataSet = new DataSet();
DataTable tableA = dataSet.Tables.Add();
DataTable tableB = dataSet.Tables.Add();

DataRelation relation = dataSet.Relations.Add(
    tableA.Columns.Add(),
    tableB.Columns.Add());

DataRow rowA = tableA.Rows.Add("1");
DataRow rowB = tableB.Rows.Add("1");

tableA.AcceptChanges(); // RowState: Unchanged
tableB.AcceptChanges(); // RowState: Unchanged

tableA.Rows.Remove(rowA);

DataRowState stateA = rowA.RowState; // Detached
DataRowState stateB = rowB.RowState; // Deleted

ただしForeignKeyConstraint.AcceptRejectRuleがCascadeに設定されているならば、子行もDetachedになります。

...
relation.ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade;
rowA.AcceptChanges(); // RowState: Unchanged

tableA.Rows.Remove(rowA);

DataRowState stateA = rowA.RowState; // Detached
DataRowState stateB = rowB.RowState; // Detached

Find()

指定の主キー (PrimaryKey) がある行を得られます。主キー以外で行を検索するには、DataTable.Select()を用います。

public System.Data.DataRow Find (object key);
Find(Object) - DataRowCollection.Find Method (System.Data) | Microsoft Learn

該当する行がないならば、nullが返されます。

あらかじめこの行が属するDataTableにPrimaryKeyを設定しておかないと、「テーブルに主キーがありません。」としてMissingPrimaryKeyExceptionが投げられます。

DataTable.CaseSensitiveがfalseならば、keyの大文字/小文字が区別されません。これは既定でfalseです。

このメソッドはDataTable.FindRow(DataKey key, Object value)を呼び出します。Find - DataRowCollection.cs

主キーが複数あるならば、配列を引数に取るメソッドを用います。

public System.Data.DataRow Find (object[] keys);
DataTable table = new DataTable();
DataColumn column1 = table.Columns.Add("col1");
DataColumn column2 = table.Columns.Add("col2");

table.Rows.Add("1", "4");
table.Rows.Add("2", "5");
table.Rows.Add("3", "6");

table.PrimaryKey = new[] { column1, column2 };

DataRow row = table.Rows.Find(new object[] { "2", "5" });

Contains()

指定の主キーが含まれているか、確認できます。

public bool Contains (object key);
Contains(Object) - DataRowCollection.Contains Method (System.Data) | Microsoft Learn

内部ではFind()と同じメソッドが呼ばれ、その結果がnullでなければtrueが返されます。Find - DataRowCollection.cs Contains - DataRowCollection.cs

GetEnumerator()

コレクションのIEnumeratorを得られます。

public override System.Collections.IEnumerator GetEnumerator ();

返されるのはIEnumeratorのため、ジェネリックのIEnumerator<T>が必要ならばCast()でキャストします。

イベント

ありません。

Microsoft Learnから検索