【.Net实用方法总结】 整理并总结System.Data中DataRow类及其方法介绍

作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。
个人主页:会敲键盘的肘子
系列专栏:.Net实用方法总结
专栏简介:博主针对.Net开发和C站问答过程中遇到的问题进行总结,形成本专栏,希望可以帮助到您解决问题。
座右铭:总有一天你所坚持的会反过来拥抱你。


【.Net实用方法总结】 整理并总结System.Data中DataRow类及其方法介绍_第1张图片

写在前面:

本文主要介绍System.Data命名空间的 DataRow 类,介绍其常用的方法和实践。


本文关键字:System.Data、DataRow类、DataTable类、方法实践、C#

文章目录

      • 1️⃣ System.Data命名空间
      • 2️⃣ DataRow类
        • ♈ 定义
        • ♊ 属性
          • Item[DataColumn] 获取或设置指定 DataColumn 中存储的数据。
          • Item[Int32] 获取或设置由索引指定的列中存储的数据
          • Item[String] 获取或设置由名称指定的列中存储的数据。
          • ItemArray 通过数组获取或设置此行的所有值
          • Table 获取列所属的 DataTable
        • ♉ 常用方法
          • AcceptChanges() 提交自上次调用 AcceptChanges() 以来对该行进行的所有更改
          • BeginEdit() 对 DataRow 对象启动编辑操作
          • EndEdit() 终止该行的编辑
          • CancelEdit() 提交自上次调用 AcceptChanges() 以来对该行进行的所有更改
          • Delete() 删除 DataRow
          • IsNull(DataColumn) 获取一个值,该值指示指定的 DataColumn 是否包含 null 值
          • IsNull(String) 获取一个值,该值指示指定的列是否包含 null 值
          • IsNull(Int32) 获取一个值,该值指示位于指定索引处的列是否包含 null 值
          • GetChildRows(DataRelation) 使用指定的 DataRelation 获取此 DataRow 的子行
          • GetChildRows(String) 使用 DataRelation 的指定 RelationName 获取 DataRow 的子行
          • GetParentRow(DataRelation) 使用指定的 DataRelation 获取此 DataRow 的父行
          • GetParentRow(String) 使用 DataRelation 的指定 RelationName 获取 DataRow 的父行
          • SetNull(DataColumn) 将指定 DataColumn 的值设置为 null 值
        • ♌ 注解
        • ♋ 更多方法

1️⃣ System.Data命名空间

提供对表示 ADO.NET 体系结构的类的访问权限。 通过 ADO.NET,可以生成可有效管理多个数据源的数据的组件。

2️⃣ DataRow类

♈ 定义

表示 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;
}

♊ 属性

Item[DataColumn] 获取或设置指定 DataColumn 中存储的数据。
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
Item[Int32] 获取或设置由索引指定的列中存储的数据
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;
}
Item[String] 获取或设置由名称指定的列中存储的数据。
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;
}
ItemArray 通过数组获取或设置此行的所有值
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]);
        }
    }
}
Table 获取列所属的 DataTable
[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);
    }
}

♉ 常用方法

AcceptChanges() 提交自上次调用 AcceptChanges() 以来对该行进行的所有更改
public void AcceptChanges ();
BeginEdit() 对 DataRow 对象启动编辑操作
public void BeginEdit ();
EndEdit() 终止该行的编辑
public void EndEdit ();
CancelEdit() 提交自上次调用 AcceptChanges() 以来对该行进行的所有更改
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 操作不会。

Delete() 删除 DataRow
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可取消删除的行。

IsNull(DataColumn) 获取一个值,该值指示指定的 DataColumn 是否包含 null 值
public bool IsNull (System.Data.DataColumn column);
IsNull(String) 获取一个值,该值指示指定的列是否包含 null 值
public bool IsNull (string columnName);
IsNull(Int32) 获取一个值,该值指示位于指定索引处的列是否包含 null 值
public bool IsNull (int columnIndex);
GetChildRows(DataRelation) 使用指定的 DataRelation 获取此 DataRow 的子行
public System.Data.DataRow[] GetChildRows (System.Data.DataRelation? relation);

参数

relation

DataRelation

要使用的 DataRelation。

返回

DataRow[]

一个 DataRow 对象数组,或长度为零的数组。

GetChildRows(String) 使用 DataRelation 的指定 RelationName 获取 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]);
                }
            }
        }
    }
}
GetParentRow(DataRelation) 使用指定的 DataRelation 获取此 DataRow 的父行
public System.Data.DataRow? GetParentRow (System.Data.DataRelation? relation);

参数

relation

DataRelation

要使用的 DataRelation。

返回

DataRow

一个 DataRow 对象数组,或长度为零的数组。

GetParentRow(String) 使用 DataRelation 的指定 RelationName 获取 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);
}
SetNull(DataColumn) 将指定 DataColumn 的值设置为 null 值
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类。


⭐写在结尾:

文章中出现的任何错误请大家批评指出,一定及时修改。

希望写在这里的小伙伴能给个三连支持

你可能感兴趣的:(.Net实用方法总结,.net,c#,DataTable,DataRow)