您好,登錄后才能下訂單哦!
最近的一個項目中,要求用一個視圖來表示數(shù)張表聯(lián)合查詢的結(jié)果,這個倒好做。但是在頁面顯示的時候,要求按一定順序來顯示,如果是每一行數(shù)據(jù)在一張表里的話,只需在視圖中添加一列當(dāng)標(biāo)識就可以,但是有幾行數(shù)據(jù)是在一張表里的,查詢出來后的順序不符合頁面顯示,雖然可以改變表的排序方式,但是感覺太麻煩,以后可能不好改,所以就用了一種笨方法,可能會對效率有影響,如果有更好的方法,大家一定要告訴我(⌒_⌒)。
我的方法就是將數(shù)據(jù)拿出來后,在業(yè)務(wù)邏輯層,用DataTable實例的Select()方法,查詢出指定的列,然后將其加入到一個空的,表架構(gòu)相同的表中(Clone()方法),這是希望整行插入到表中的,如果一個單元格一個單元格的復(fù)制,那就太沒效率了(●''●),雖然我這個也沒什么效率啦……
然后在插入的時候遇到了問題
DataTable dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B"); dt.Columns.Add("C"); DataRow dr = dt.NewRow(); //處理dr中的數(shù)據(jù) dt.Rows.Add(dr);
這是標(biāo)準(zhǔn)寫法。
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中的數(shù)據(jù) dt2.Rows.Add(dr);
但是這樣寫就會報錯,“該行已經(jīng)屬于另一個表。”
這是因為dr的Table屬性是指向dt的。
但是現(xiàn)在查看dt.Row.Count時,發(fā)現(xiàn)是0,而不是1呢?
這涉及到一個DataRowState 的問題
DataRowState 有5種狀態(tài)
Detached | 該行已被創(chuàng)建,但不屬于任何 System.Data.DataRowCollection。System.Data.DataRow 在以下情況下立即處于此狀態(tài):創(chuàng)建之后添加到集合中之前;或從集合中移除之后。 |
Unchanged | 該行自上次調(diào)用 System.Data.DataRow.AcceptChanges() 以來尚未更改。 |
Added | 該行已添加到System.Data.DataRowCollection 中,System.Data.DataRow .AcceptChanges()尚未調(diào)用。 |
Deleted | 該行已通過 System.Data.DataRow 的 System.Data.DataRow.Delete() 方法被刪除。 |
Modified | 該行已通過 System.Data.DataRow 的 System.Data.DataRow.Delete() 方法被刪除。 |
DataRow dr = dt.NewRow(); //創(chuàng)建dr后,dr的DataRowState為Detached dt2.Rows.Add(dr); // dr的DataRowState為Added
也就是狀態(tài)的更改。
但是如果我們把dt2.Rows.Add(dr)換成dt2.Rows.ImportRow(dr)后,發(fā)現(xiàn)dt中仍然沒有dr,也就是dt.Row.Count為0。這是因為ImportRow方法負責(zé)復(fù)制dr到dt中,包括DataRowState。但是復(fù)制的時候會改標(biāo)dr的Table的指向,也就是指向當(dāng)前調(diào)用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"); }
輸出結(jié)果:
dt=dr
但是我們的目標(biāo)是將挑選出來的行,添加到相同結(jié)構(gòu)的空表中,對于挑選的結(jié)果行,是能添加到空表中的,因為如果是從一個DataTable中取出DataRow,那么這個DataRow的DataRowState是Add,也就是使用ImportRow方法添加到空表后可以看到結(jié)果,如果是通過dt = new DataTable()創(chuàng)建的且未添加到DataTable的DataRow,使用ImportRow方法添加到空表后是看不到結(jié)果的。
DataTable dt,dt2; DataRow dr,dr2; dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B"); dt.Columns.Add("C"); dr = dt.NewRow(); dr2 = dt.NewRow(); dt2 = dt.Clone(); dt.Rows.Add(dr); dt2.ImportRow(dr2); Console.WriteLine(dt2.Rows.Count.ToString()); dt2.ImportRow(dt.Rows[0]); Console.WriteLine(dt2.Rows.Count.ToString());
結(jié)果:
0
1
注意:ImportRow方法是復(fù)制DataRow,也就是說會創(chuàng)建一個新的DataRow,而不是引用原來的DataRow。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。