作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。
个人主页:会敲键盘的肘子
系列专栏:.Net实用方法总结
专栏简介:博主针对.Net开发和C站问答过程中遇到的问题进行总结,形成本专栏,希望可以帮助到您解决问题。
座右铭:总有一天你所坚持的会反过来拥抱你。
写在前面:
本文主要介绍System.Data命名空间的 DataRow 类,介绍其常用的方法和实践。
本文关键字:System.Data、DataRow类、DataTable类、方法实践、C#
提供对表示 ADO.NET 体系结构的类的访问权限。 通过 ADO.NET,可以生成可有效管理多个数据源的数据的组件。
表示 DataTable 中的一行数据。
public class DataRow
示例
以下示例通过调用NewRow对象的方法DataTable创建新的DataRow方法。
private void CreateNewDataRow()
{
// Use the MakeTable function below to create a new table.
DataTable table;
table = MakeNamesTable();
// Once a table has been created, use the
// NewRow to create a DataRow.
DataRow row;
row = table.NewRow();
// Then add the new row to the collection.
row["fName"] = "John";
row["lName"] = "Smith";
table.Rows.Add(row);
foreach(DataColumn column in table.Columns)
Console.WriteLine(column.ColumnName);
dataGrid1.DataSource=table;
}
private DataTable MakeNamesTable()
{
// Create a new DataTable titled 'Names.'
DataTable namesTable = new DataTable("Names");
// Add three column objects to the table.
DataColumn idColumn = new DataColumn();
idColumn.DataType = System.Type.GetType("System.Int32");
idColumn.ColumnName = "id";
idColumn.AutoIncrement = true;
namesTable.Columns.Add(idColumn);
DataColumn fNameColumn = new DataColumn();
fNameColumn.DataType = System.Type.GetType("System.String");
fNameColumn.ColumnName = "Fname";
fNameColumn.DefaultValue = "Fname";
namesTable.Columns.Add(fNameColumn);
DataColumn lNameColumn = new DataColumn();
lNameColumn.DataType = System.Type.GetType("System.String");
lNameColumn.ColumnName = "LName";
namesTable.Columns.Add(lNameColumn);
// Create an array for DataColumn objects.
DataColumn [] keys = new DataColumn [1];
keys[0] = idColumn;
namesTable.PrimaryKey = keys;
// Return the new DataTable.
return namesTable;
}
public object this[System.Data.DataColumn column] { get; set; }
示例
以下示例演示如何使用 [Item] 属性获取和设置特定列索引的值。 第一个示例获取用户在控件中 DataGrid 单击的任何行中第一列的值。 第二个设置作为参数传递给方法的值。
Private Sub DataGrid1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Dim dataGridTable As DataTable = _
CType(DataGrid1.DataSource, DataTable)
' Set the current row using the RowNumber
' property of the CurrentCell.
Dim currentRow As DataRow = _
dataGridTable.Rows(DataGrid1.CurrentCell.RowNumber)
Dim column As DataColumn = dataGridTable.Columns(1)
' Get the value of the column 1 in the DataTable.
label1.Text = currentRow(column).ToString()
End Sub
Private Sub SetDataRowValue( _
ByVal grid As DataGrid, ByVal newVal As Object)
' Set the value of a column in the last row of a DataGrid.
Dim table As DataTable = CType(grid.DataSource, DataTable)
Dim row As DataRow = table.Rows(table.Rows.Count - 1)
Dim column As DataColumn = table.Columns("FirstName")
row(column)= newVal
End Sub
public object this[int columnIndex] { get; set; }
示例
以下示例演示如何使用 [Item] 属性获取和设置特定列索引的值。 第一个示例获取用户在控件中 DataGrid 单击的任何行中第一列的值。
private void DataGrid1_Click(object sender,
System.EventArgs e)
{
// Get the DataTable the grid is bound to.
DataGrid thisGrid = (DataGrid) sender;
DataTable table = (DataTable) thisGrid.DataSource;
DataRow currentRow =
table.Rows[thisGrid.CurrentCell.RowNumber];
// Get the value of the column 1 in the DataTable.
Console.WriteLine(currentRow[1]);
// You can also use the name of the column:
// Console.WriteLine(currentRow["FirstName"])
}
private void SetDataRowValue(DataGrid grid, object newValue)
{
// Set the value of the last column in the last row of a DataGrid.
DataTable table;
table = (DataTable) grid.DataSource;
DataRow row;
// Get last row
row = (DataRow)table.Rows[table.Rows.Count-1];
// Set value of last column
row[table.Columns.Count-1] = newValue;
}
public object this[string columnName] { get; set; }
示例
以下示例演示如何使用 [Item] 属性获取和设置特定列索引的值。 第一个示例获取用户在控件中 DataGrid 单击的任何行中第一列的值。 第二个设置作为参数传递给方法的值。
private void DataGrid1_Click(
object sender, System.EventArgs e)
{
// Get the DataTable the grid is bound to.
DataGrid thisGrid = (DataGrid) sender;
DataTable table = (DataTable) thisGrid.DataSource;
DataRow currentRow =
table.Rows[thisGrid.CurrentCell.RowNumber];
// Get the value of the column 1 in the DataTable.
Console.WriteLine(currentRow["FirstName"]);
// You can also use the index:
// Console.WriteLine(currentRow[1]);
}
private void SetDataRowValue(
DataGrid grid, object newValue)
{
// Set the value of the first column in
// the last row of a DataGrid.
DataTable table = (DataTable) grid.DataSource;
DataRow row = table.Rows[table.Rows.Count-1];
row["FirstName"] = newValue;
}
public object?[] ItemArray { get; set; }
示例
以下示例演示如何使用 ItemArray 属性获取和设置值。
private void CreateRowsWithItemArray()
{
// Make a DataTable using the function below.
DataTable dt = MakeTableWithAutoIncrement();
DataRow relation;
// Declare the array variable.
object [] rowArray = new object[2];
// Create 10 new rows and add to DataRowCollection.
for(int i = 0; i <10; i++)
{
rowArray[0]=null;
rowArray[1]= "item " + i;
relation = dt.NewRow();
relation.ItemArray = rowArray;
dt.Rows.Add(relation);
}
PrintTable(dt);
}
private DataTable MakeTableWithAutoIncrement()
{
// Make a table with one AutoIncrement column.
DataTable table = new DataTable("table");
DataColumn idColumn = new DataColumn("id",
Type.GetType("System.Int32"));
idColumn.AutoIncrement = true;
idColumn.AutoIncrementSeed = 10;
table.Columns.Add(idColumn);
DataColumn firstNameColumn = new DataColumn("Item",
Type.GetType("System.String"));
table.Columns.Add(firstNameColumn);
return table;
}
private void PrintTable(DataTable table)
{
foreach(DataRow row in table.Rows)
{
foreach(DataColumn column in table.Columns)
{
Console.WriteLine(row[column]);
}
}
}
[System.ComponentModel.Browsable(false)]
public System.Data.DataTable? Table { get; }
该行所属的 DataTable。
示例
以下示例使用 Table 属性返回对列集合的 DataTable引用。
private void GetTable(DataRow row)
{
// Get the DataTable of a DataRow
DataTable table = row.Table;
// Print the DataType of each column in the table.
foreach(DataColumn column in table.Columns)
{
Console.WriteLine(column.DataType);
}
}
public void AcceptChanges ();
public void BeginEdit ();
public void EndEdit ();
public void AcceptChanges ();
示例
该示例创建一个包含一DataColumn个和五DataRow个对象的简单DataTable对象,以及一个 UniqueConstraint。 RowChanged还会添加事件处理程序,用于监视行的值在更改时。 调用 BeginEdit 现有行后,将暂时禁用约束和事件,并打印原始值和建议值。 再次调用该 BeginEdit 函数以将两行设置为同一值。 调用时 EndEdit ,将对 UniqueConstraint 相同的值强制实施。
private void DemonstrateRowBeginEdit()
{
DataTable table = new DataTable("table1");
DataColumn column = new
DataColumn("col1",Type.GetType("System.Int32"));
table.RowChanged+=new
DataRowChangeEventHandler(Row_Changed);
table.Columns.Add(column);
// Add a UniqueConstraint to the table.
table.Constraints.Add(new UniqueConstraint(column));
// Add five rows.
DataRow newRow;
for(int i = 0;i<5; i++)
{
// RowChanged event will occur for every addition.
newRow= table.NewRow();
newRow[0]= i;
table.Rows.Add(newRow);
}
// AcceptChanges.
table.AcceptChanges();
// Invoke BeginEdit on each.
Console.WriteLine(
"\n Begin Edit and print original and proposed values \n");
foreach(DataRow row in table.Rows)
{
row.BeginEdit();
row[0]=(int) row[0]+10;
Console.Write("\table Original \table" +
row[0, DataRowVersion.Original]);
Console.Write("\table Proposed \table" +
row[0,DataRowVersion.Proposed] + "\n");
}
Console.WriteLine("\n");
// Accept changes
table.AcceptChanges();
// Change two rows to identical values after invoking BeginEdit.
table.Rows[0].BeginEdit();
table.Rows[1].BeginEdit();
table.Rows[0][0]= 100;
table.Rows[1][0]=100;
try
{
/* Now invoke EndEdit. This will cause the UniqueConstraint
to be enforced.*/
table.Rows[0].EndEdit();
table.Rows[1].EndEdit();
}
catch(Exception e)
{
// Process exception and return.
Console.WriteLine("Exception of type {0} occurred.",
e.GetType());
}
}
private void Row_Changed(object sender,
System.Data.DataRowChangeEventArgs e)
{
DataTable table = (DataTable) sender;
Console.WriteLine("RowChanged " + e.Action.ToString()
+ "\table" + e.Row.ItemArray[0]);
}
注意
使用该方法 BeginEdit 将编辑 DataRow 模式放入编辑模式。 在此模式下,事件会暂时挂起,使用户无需触发验证规则即可对多行进行更改。 例如,如果必须确保总金额的列值等于行中的借记和信用列的值,则可以将每行置于编辑模式,以暂停行值的验证,直到用户尝试提交值。
BeginEdit当用户更改数据绑定控件的值时隐式调用该方法;EndEdit在调用AcceptChanges对象方法DataTable时隐式调用该方法。 在此编辑模式下,存储 DataRow 原始值和新建议值的表示形式。 因此,只要 EndEdit 尚未调用该方法,就可以通过传递
DataRowVersion.Original
属性的参数来检索原始版本或DataRowVersion.Proposed
version
[Item] 建议的版本。 还可以通过调用 CancelEdit 该方法来取消此时的任何编辑。若要查看行是否包含原始值或建议的值,请调用 HasVersion 该方法。
该方法 BeginEdit 暂时挂起 RowChanging 事件,但
delete
操作不会。
public void Delete ();
示例
以下示例创建一个包含两列和十行的简单 DataTable 操作。 使用Delete该方法删除多个DataRow项后,通过调用RejectChanges取消删除其中一行。
private void DemonstrateDeleteRow()
{
// Create a simple DataTable with two columns and ten rows.
DataTable table = new DataTable("table");
DataColumn idColumn = new DataColumn("id",
Type.GetType("System.Int32"));
idColumn.AutoIncrement=true;
DataColumn itemColumn = new DataColumn("item",
Type.GetType("System.String"));
table.Columns.Add(idColumn);
table.Columns.Add(itemColumn);
// Add ten rows.
DataRow newRow;
for(int i = 0; i <10; i++)
{
newRow = table.NewRow();
newRow["item"] = "Item " + i;
table.Rows.Add(newRow);
}
table.AcceptChanges();
DataRowCollection itemColumns = table.Rows;
itemColumns[0].Delete();
itemColumns[2].Delete();
itemColumns[3].Delete();
itemColumns[5].Delete();
Console.WriteLine(itemColumns[3].RowState.ToString());
// Reject changes on one deletion.
itemColumns[3].RejectChanges();
// Change the value of the column so it stands out.
itemColumns[3]["item"] = "Deleted, Undeleted, Edited";
// Accept changes on others.
table.AcceptChanges();
// Print the remaining row values.
foreach(DataRow row in table.Rows)
{
Console.WriteLine(row[0] + "\table" + row[1]);
}
}
注意
RowState如果添加该行,RowState则调用AcceptChanges时,该行将从
Detached
表中删除。在现有DataRow方法上使用Delete该方法后,
Deleted
将RowState变为此对象。 它保持不变,Deleted
直到你打电话 AcceptChanges。 此时, DataRow 将从表中删除该表。Delete 在循环访问 DataRowCollection 对象时,不应在 foreach 循环中调用。 Delete 修改集合的状态。
通过调用 RejectChanges可取消删除的行。
public bool IsNull (System.Data.DataColumn column);
public bool IsNull (string columnName);
public bool IsNull (int columnIndex);
public System.Data.DataRow[] GetChildRows (System.Data.DataRelation? relation);
参数
relation
DataRelation
要使用的 DataRelation。
返回
DataRow[]
一个 DataRow 对象数组,或长度为零的数组。
public System.Data.DataRow[] GetChildRows (string? relationName);
参数
relationName
string
要使用的 DataRelation 的 RelationName。
返回
DataRow[]
一个 DataRow 对象数组,或长度为零的数组。
示例
private void GetChildRowsFromDataRelation(DataTable table)
{
DataRow[] arrRows;
foreach(DataRelation relation in table.ChildRelations)
{
foreach(DataRow row in table.Rows)
{
arrRows = row.GetChildRows(relation);
// Print values of rows.
for(int i = 0; i < arrRows.Length; i++)
{
foreach(DataColumn column in table.Columns)
{
Console.WriteLine(arrRows[i][column]);
}
}
}
}
}
public System.Data.DataRow? GetParentRow (System.Data.DataRelation? relation);
参数
relation
DataRelation
要使用的 DataRelation。
返回
DataRow
一个 DataRow 对象数组,或长度为零的数组。
public System.Data.DataRow? GetParentRow (string? relationName);
参数
relationName
string
要使用的 DataRelation 的 RelationName。
返回
DataRow
一个 DataRow 对象数组,或长度为零的数组。
示例
private void GetParentRowForTable(DataTable thisTable,
DataRelation relation)
{
if(thisTable ==null){return;}
// For each row in the table, print column 1
// of the parent DataRow.
DataRow parentRow;
foreach(DataRow row in thisTable.Rows)
{
parentRow = row.GetParentRow(relation);
Console.Write("\table child row: " + row[1]);
Console.Write("\table parent row: " + parentRow[1]+ "\n");
}
}
private void CallGetParentRowForTable()
{
// An example of calling the function.
DataTable thisTable = DataSet1.Tables["Products"];
DataRelation relation = thisTable.ParentRelations[0];
GetParentRowForTable(thisTable, relation);
}
protected void SetNull (System.Data.DataColumn column);
参数
column
和DataRowDataColumn对象是 a DataTable. 的主要组件。 DataRow使用对象及其属性和方法检索和计算;并在其中插入、删除和更新值DataTable。 表示DataRowCollection其中DataTable的实际DataRow对象,并DataColumnCollection包含DataColumn描述架构的对象DataTable。 使用重载 [Item] 属性返回或设置值 DataColumn。
HasVersion使用和IsNull属性确定特定行值的状态,以及RowState用于确定相对于其父DataTable行的行的状态的属性。
若要创建新 DataRow对象,请使用 NewRow 该对象的方法 DataTable 。 创建新DataRow后,使用Add该方法将新DataRow内容添加到 。DataRowCollection 最后,调用 AcceptChanges 对象的方法来 DataTable 确认添加。 有关将数据添加到 a DataTable的详细信息,请参阅 将数据添加到 DataTable。
可以通过调用对象的方法DataRowCollection或调用Delete对象的方法DataRow从DataRowCollection中删除 aDataRow。Remove 该方法 Remove 从集合中删除该行。 相比之下, Delete 标记 DataRow 要删除的内容。 调用 AcceptChanges 方法时将发生实际删除。 通过调用 Delete,可以编程方式检查哪些行被标记为删除,然后再实际删除它们。 有关详细信息,请参阅 DataRow 删除。
更多方法请查阅官方文档DataRow类。
⭐写在结尾:
文章中出现的任何错误请大家批评指出,一定及时修改。
希望写在这里的小伙伴能给个三连支持!