今天在寫一個程序是遇到DataTable中添加行添加不了的問題,代碼以下:ide
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()的區別;spa
一、首先,咱們先說下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還沒有調用。code
其實NewRow()建立的行其RowState是Detached,顯而易見新建的行是不可見。對象
二、ImportRow()
將DateRow複製到DataTable中,保留任何屬性設置以及初始值和當前值。可是當DataRow的RowState屬性爲Detached時沒法複製,因此可見上述黃色代碼不可行了。網上有人說不能複製是由於新建的行隸屬於原表,我認爲這是不正確,究其緣由非常由於行的屬性。其實若是咱們把行的屬性改變的話,ImportRow()方法仍是可行的。
ImportRow()通常用於將一個表中的數據複製到另外一個表中。實例代碼以下:blog
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 }
三、Add()
將制定的DataRow添加到DataRowCollection對象中。實例代碼以下:qt
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 }
添加完後DataRow的RowState屬性變爲Added。因此把上述的dtAppendix.ImportRow(dr)改成dtAppendix.Rows.Add(dr)便可。it