DataTabel中关于ImpotRow的一点尝试
最近的一個項目中,要求用一個視圖來表示數張表聯合查詢的結果,這個倒好做。但是在頁面顯示的時候,要求按一定順序來顯示,如果是每一行數據在一張表里的話,只需在視圖中添加一列當標識就可以,但是有幾行數據是在一張表里的,查詢出來后的順序不符合頁面顯示,雖然可以改變表的排序方式,但是感覺太麻煩,以后可能不好改,所以就用了一種笨方法,可能會對效率有影響,如果有更好的方法,大家一定要告訴我(⌒_⌒)。
?
我的方法就是將數據拿出來后,在業務邏輯層,用DataTable實例的Select()方法,查詢出指定的列,然后將其加入到一個空的,表架構相同的表中(Clone()方法),這是希望整行插入到表中的,如果一個單元格一個單元格的復制,那就太沒效率了(●''●),雖然我這個也沒什么效率啦……
然后在插入的時候遇到了問題
?DataTable?dt?=?new?DataTable();dt.Columns.Add("A");dt.Columns.Add("B");dt.Columns.Add("C"); DataRow?dr?=?dt.NewRow();//處理dr中的數據dt.Rows.Add(dr);這是標準寫法。
DataTable?dt?=?new?DataTable();dt.Columns.Add("A");dt.Columns.Add("B");dt.Columns.Add("C"); DataRow?dr?=?dt.NewRow();DataTable?dt2?=?dt.Clone();//處理dr中的數據dt2.Rows.Add(dr);但是這樣寫就會報錯,“該行已經屬于另一個表。”
這是因為dr的Table屬性是指向dt的。
但是現在查看dt.Row.Count時,發現是0,而不是1呢?
這涉及到一個DataRowState 的問題
DataRowState 有5種狀態
| Detached | 該行已被創建,但不屬于任何 System.Data.DataRowCollection。System.Data.DataRow 在以下情況下立即處于此狀態:創建之后添加到集合中之前;或從集合中移除之后。 |
| Unchanged | 該行自上次調用 System.Data.DataRow.AcceptChanges() 以來尚未更改。 |
| Added | 該行已添加到System.Data.DataRowCollection 中,System.Data.DataRow .AcceptChanges()尚未調用。 |
| Deleted | 該行已通過 System.Data.DataRow 的 System.Data.DataRow.Delete() 方法被刪除。 |
| Modified | 該行已通過 System.Data.DataRow 的 System.Data.DataRow.Delete() 方法被刪除。 |
也就是狀態的更改。
? 但是如果我們把dt2.Rows.Add(dr)換成dt2.Rows.ImportRow(dr)后,發現dt中仍然沒有dr,也就是dt.Row.Count為0。這是因為ImportRow方法負責復制dr到dt中,包括DataRowState。但是復制的時候會改標dr的Table的指向,也就是指向當前調用ImportRow方法的DataTable。
例如:
DataTable?dt,dt2; DataRow?dr;dt?=?new?DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B"); dt.Columns.Add("C");dr?=?dt.NewRow();dt2?=?dt.Clone();if?(dt2.Rows[0].Table?==?dt) {Console.WriteLine("dt2=dt");}if?(dt.Rows[0]?==?dr){Console.WriteLine("dt=dr");}if?(dt2.Rows[0]?==?dr){Console.WriteLine("dt2=dr");}輸出結果:
dt=dr
? 但是我們的目標是將挑選出來的行,添加到相同結構的空表中,對于挑選的結果行,是能添加到空表中的,因為如果是從一個DataTable中取出DataRow,那么這個DataRow的DataRowState是Add,也就是使用ImportRow方法添加到空表后可以看到結果,如果是通過dt = new DataTable()創建的且未添加到DataTable的DataRow,使用ImportRow方法添加到空表后是看不到結果的。
?
結果:
0
1
?
注意:ImportRow方法是復制DataRow,也就是說會創建一個新的DataRow,而不是引用原來的DataRow。
轉載于:https://blog.51cto.com/270jia40/1626056
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的DataTabel中关于ImpotRow的一点尝试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCL发布超薄零嵌冰箱T9首发价格349
- 下一篇: 知乎转发我的想法通知怎么关闭