国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

一種快速存取選擇條目的方案(Asp.Net+C#)

2024-07-10 12:57:49
字體:
來源:轉載
供稿:網友

引言:

我們在做項目開發的過程中,經常會遇到把許多條目的信息的選擇情況記錄到用戶的相關設置當中問題,比較笨的辦法是每一個條目對應用戶設置表中的一個屬性字段,但這樣的設計似乎擴展性很差,效率也好不到哪里去,這里提供一種快速存儲n條記錄的方案,即用一個整型數據來記錄條目的選擇狀態。



內容:

一、表結構:

 兩個table



item 項目表

key: id

field name
type
length
default
description

id
int
4

id(自動編號)

itemname
nvarchar
50
0
條目名稱










userinfo 用戶信息表

key: userid

field name
type
length
default
description

userid
int
4

id(自動編號)

itemrecord
int
4
0
條目選擇記錄




 一點說明:我們的目的就是要把用戶對item中所有的記錄的選擇情況進行記錄,經過一定的處理存儲到itemrecord中。

二、數據層類:

 四個:quickitem、quickitemcollection、userinfo、userinfocollection

 一點說明:

1、 quicitem:對條目信息進行處理的類,包含四種方法,即對數據的添、刪、改、讀。

2、 quickitemcollection:這是個查詢類,根據一定條件讀取條目的集合。

3、 userinfo:對用戶信息進行處理的類,包含四種方法,即對數據的添、刪、改、讀。

4、 userinfocollection:這是個查詢類,根據一定條件讀取用戶信息的集合。

三、表示層調用處理:



//取得個人選中項目的信息

userinfo ui = new userinfo();

ui.id=1;

ui.getinfobyid();

int itemrecord=ui.itemrecord;



//取得所有項目的id數組

quickitemcollection qic = new quickitemcollection();

qic.getallinfo();

int qiccount=qic.count;

string itemidarraystring=null;

for(int i=0;i<qiccount;i++)

{

itemidarraystring+=","+qic[i].id;

}

itemidarraystring=itemidarraystring.substring(1,itemidarraystring.length-1);

char[] dot = new char[]{','};

string[] itemidarray = itemidarraystring.split(dot);





//調用方法返回選中的項目的id數組

string [] selectitemarray=selectitemarray(itemidarray,itemrecord);



一點說明:上面這段代碼就是讀取條目信息和個人設置進行相應的處理的,selectitemarray是個私有方法,代碼如下:



#region 取得選中項目記錄集

/// <summary>

/// 取得選中項目記錄集

/// </summary>

/// <param name="tempitemidarray">所有項目記錄集</param>

/// <param name="tempitemrecord">項目選擇信息</param>

/// <returns>選中項目記錄集</returns>

private string[] selectitemarray(string[] tempitemidarray,int tempitemrecord)

{

//項目的id數組元素個數

int itemidarraycount=tempitemidarray.length;

//將整形記錄轉化成二進制

string itemrecordstring = convert.tostring(tempitemrecord,2);

//存儲的選擇信息位個數

int itemrecordstringcount=itemrecordstring.length;

//需要補0的個數

int addzerocount=itemidarraycount-itemrecordstringcount;

//開始往高位補0

for(int i=0;i<addzerocount;i++)

{

itemrecordstring="0"+itemrecordstring;

}



//選中id字符串

string selectitemstring=null;

//開始匹配選中項

int count=itemrecordstring.length;

for(int j=0;j<count;j++)

{

if(int32.parse(itemrecordstring.substring(j,1))==1)

{

selectitemstring+=","+tempitemidarray[j];

}

}

//剃除第一個","

selectitemstring=selectitemstring.substring(1,selectitemstring.length-1);

char[] dot = new char[]{','};

//返回選中的項目id數組

return selectitemstring.split(dot);

}

#endregion

一點說明:

如果你還沒有看明白上面的代碼,那么現在就看我來解釋給你聽。這里的方案其實是利用了二進制數據位的“0”“1”來標識是否選中某條目的,如果選中即為“1”,每一個條目都對應一個二進制位,如果item中有五條數據,那么全是“11111”,這樣的二進制數據,如果我們想選中第一條、第二條和第五條數據,那么對應的二進制代碼表示為“10101”,然后我們把這個二進制數據轉化成十進制數據就是:16+0+4+0+1=21,如此種種我們可以通過轉換記錄各種組合的記錄。這里要注意的是新增條目的問題,如果現在條目變成了七條怎么辦?不用擔心,變成了七條,那么就有七個位“1111111”,那么這個時候我原來的選中三條數據是不要變化的,這增加的兩個位是增加在高位上的,即現在的存儲表示變成了“0010101”,就是:0+0+16+0+4+0+1=21,數值是沒有變化的。一般情況下我們是添加條目,很少有減少條目的情況,如果要減少條目,肯定要另外寫程序來重置itemrecord的值的。

那么用戶重新選擇條目后,如何重置itemrecord值呢?下面聽我慢慢道來,像這種多選的條目一般都會由checkboxlist綁定出來進行選擇操作的,我們也就是對這個對象的元素選中情況進行處理,代碼片段如下:

int itemcount=checkboxlist_item.items.count;

for(int i=0;i<itemcount;i++)

{

if(checkboxlist_item.items[i].selected)

{

itemselect=itemselect+"1";

}

else

{

itemselect=itemselect+"0";

}

}

int itemrecord=convert.toint32(itemselect, 2);



一點說明:首先獲得條目的個數,然后做循環,判斷是否選中,如果選中則相應的位值為“1”,否則為“0”,組合出來二進制字符串然后再進行個進制轉換,然后再入庫就一切搞定了。

是不是很方便呢?不僅方便這種存儲效率是非常高的,如果你有幾百個條目要選擇,這種方案便是一個不錯的選擇,不過,你如果真搞幾百個條目讓別人選,除非是被逼無奈的應付考試,否則一定會遭遇強烈的鄙視的,誰有耐心去做這個選擇嘛,哈哈!

 不要急,再給一個提醒看看,千萬不要把順序搞錯了,綁定checkboxlist的時候,按照desc的順序來綁定元素列表,不然,吼吼……

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 株洲县| 金沙县| 芜湖县| 灵宝市| 都江堰市| 绥阳县| 齐河县| 宁武县| 龙山县| 姚安县| 岳普湖县| 武乡县| 西乌| 噶尔县| 遂平县| 丰县| 石柱| 磐石市| 阿巴嘎旗| 长垣县| 柞水县| 文水县| 荆州市| 孝昌县| 徐闻县| 甘德县| 土默特右旗| 玉屏| 安塞县| 榆中县| 湘阴县| 恩施市| 承德县| 西丰县| 黎城县| 平遥县| 镇沅| 安新县| 武功县| 固阳县| 怀来县|