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)即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM