zoukankan      html  css  js  c++  java
  • DataTable.ImportRow()与DataTable.Rows.Add()的区别

    今天在写一个程序是遇到DataTable中添加行添加不了的问题,代码如下:

            DataTable dt = dataGridView1.DataSource as DataTable;
                DataTable dtTemp = stfBLL.GetDataByBoxID(boxId);
                DataRow dr = dt.NewRow();
                dr["BoxID"] = dtTemp.Rows[0]["PicID"].ToString();
                dr["Item"] = dtTemp.Rows[0]["Item"].ToString();
                dr["LotNumber"] = dtTemp.Rows[0]["KS_LOT"].ToString();
                dr["STK"] = stk;
                dr["Bin"] = bin;
                dr["Qty"] = Convert.ToSingle(qty);
                dt.ImportRow(dr);
                dataGridView1.DataSource = dt;

    试了几次都没把数据添加上去,于是找度娘求助,原因是DataTable的ImportRow()和Rows.Add()的区别;

    1、首先,我们先说下DataTable.NewRow()方法,这个方法可以创建和表具有相同构架的DataRow(而且必须使用这个方法才能创建和原表一样构架的DataRow),并且这个新行是添加在原表上的。但是我发现这个DataTable中并没有这个空行。为什么?原因是这样的:原来Datatable中Rows都一个RowState属性,共有如下几种:
    1,Detached 该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。
    2,Unchanged 该行自上次调用AcceptChanges以来尚未更改。
    3,Added 该行已添加到DataRowCollection中,AcceptChanges尚未调用。
    4,Deleted 该行已通过DataRow的Delete方法被删除。
    5,Modified 该行已被修改,AcceptChanges尚未调用。

    其实NewRow()创建的行其RowState是Detached,显而易见新建的行是不可见。

    2、ImportRow()
    将DateRow复制到DataTable中,保留任何属性设置以及初始值和当前值。但是当DataRow的RowState属性为Detached时无法复制,所以可见上述黄色代码不可行了。网上有人说不能复制是因为新建的行隶属于原表,我认为这是不正确,究其原因很是因为行的属性。其实如果我们把行的属性改变的话,ImportRow()方法还是可行的。
    ImportRow()一般用于将一个表中的数据复制到另一个表中。实例代码如下:

    1 private DataTable HowToUseImportRow(DataTable dt)
    2 {
    3 DataTable dtNew = dt.Clone();
    4 foreach (DataRow dr in dt.Rows)
    5 {
    6 dtNew.ImportRow(dr);
    7 }
    8 return dtNew;
    9 }
    View Code

    3、Add()
    将制定的DataRow添加到DataRowCollection对象中。实例代码如下:

     1 private void AddRow(DataTable table)
     2 {
     3 DataRowCollection rowCollection = table.Rows;
     4 // Instantiate a new row using the NewRow method.
     5 
     6 DataRow newRow = table.NewRow();
     7 // Insert code to fill the row with values.
     8 
     9 // Add the row to the DataRowCollection.
    10 table.Rows.Add(newRow);
    11 }
    View Code

    添加完后DataRow的RowState属性变为Added。所以把上述的dtAppendix.ImportRow(dr)改为dtAppendix.Rows.Add(dr)即可。

  • 相关阅读:
    ORA-01439: column to be modified must be empty to change datatype
    解决rhel相关系统下yum找不到安装包的解决方法
    oracle的function和procedure返回值给shell
    [摘] SQLPLUS Syntax
    Unix/Linux中shell调用sqlplus的方式
    sqlplus连接数据库的4种方式
    shell调用sqlplus批量执行sql文件
    shell自定义函数
    Java创建Oracle数据库表
    TCP的三次握手(建立连接)和四次挥手(关闭连接)
  • 原文地址:https://www.cnblogs.com/jerrylucky/p/4057231.html
Copyright © 2011-2022 走看看