型 | プロパティ | 内容 |
---|---|---|
DataRow | Item[Int32] | 指定のインデックスにある行 |
int | Count | コレクション内のDataRowオブジェクトの総数 |
object | SyncRoot | コレクションの同期に使用するオブジェクト |
コレクション内の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) | 指定の行のインデックスを得られる |
指定の値で行を作成し、それをコレクションに追加できます。
public System.Data.DataRow Add (params object[] values);Add(Object[]) - DataRowCollection.Add Method (System.Data) | Microsoft Learn
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
指定の主キー (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" });
指定の主キーが含まれているか、確認できます。
public bool Contains (object key);Contains(Object) - DataRowCollection.Contains Method (System.Data) | Microsoft Learn
内部ではFind()と同じメソッドが呼ばれ、その結果がnullでなければtrueが返されます。Find - DataRowCollection.cs Contains - DataRowCollection.cs
コレクションのIEnumeratorを得られます。
public override System.Collections.IEnumerator GetEnumerator ();
返されるのはIEnumeratorのため、ジェネリックのIEnumerator<T>が必要ならばCast()でキャストします。
ありません。