DataTabel中關(guān)于ImpotRow的一點(diǎn)嘗試

最近的一個(gè)項(xiàng)目中,要求用一個(gè)視圖來表示數(shù)張表聯(lián)合查詢的結(jié)果,這個(gè)倒好做。但是在頁面顯示的時(shí)候,要求按一定順序來顯示,如果是每一行數(shù)據(jù)在一張表里的話,只需在視圖中添加一列當(dāng)標(biāo)識就可以,但是有幾行數(shù)據(jù)是在一張表里的,查詢出來后的順序不符合頁面顯示,雖然可以改變表的排序方式,但是感覺太麻煩,以后可能不好改,所以就用了一種笨方法,可能會對效率有影響,如果有更好的方法,大家一定要告訴我(⌒_⌒)。

為東源等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及東源網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、東源網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

 

我的方法就是將數(shù)據(jù)拿出來后,在業(yè)務(wù)邏輯層,用DataTable實(shí)例的Select()方法,查詢出指定的列,然后將其加入到一個(gè)空的,表架構(gòu)相同的表中(Clone()方法),這是希望整行插入到表中的,如果一個(gè)單元格一個(gè)單元格的復(fù)制,那就太沒效率了(●''●),雖然我這個(gè)也沒什么效率啦……

然后在插入的時(shí)候遇到了問題

 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);

但是這樣寫就會報(bào)錯(cuò),“該行已經(jīng)屬于另一個(gè)表。”

這是因?yàn)閐r的Table屬性是指向dt的。

但是現(xiàn)在查看dt.Row.Count時(shí),發(fā)現(xiàn)是0,而不是1呢?

這涉及到一個(gè)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。這是因?yàn)镮mportRow方法負(fù)責(zé)復(fù)制dr到dt中,包括DataRowState。但是復(fù)制的時(shí)候會改標(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é)果行,是能添加到空表中的,因?yàn)槿绻菑囊粋€(gè)DataTable中取出DataRow,那么這個(gè)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)建一個(gè)新的DataRow,而不是引用原來的DataRow。

分享題目:DataTabel中關(guān)于ImpotRow的一點(diǎn)嘗試
文章轉(zhuǎn)載:http://bm7419.com/article22/ipdcjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、App設(shè)計(jì)、電子商務(wù)、微信小程序、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化