一种快速存取选择条目的方案(Asp.Net+C#)

asp.net

引言:

我们在做项目开发的过程中,经常会遇到把许多条目的信息的选择情况记录到用户的相关设置当中问题,比较笨的办法是每一个条目对应用户设置表中的一个属性字段,但这样的设计似乎扩展性很差,效率也好不到哪里去,这里提供一种快速存储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的顺序来绑定元素列表,不然,吼吼……

时间: 2024-10-02 07:06:53

一种快速存取选择条目的方案(Asp.Net+C#)的相关文章

一种粗暴快速的Android全屏幕适配方案

本文讲的是一种粗暴快速的Android全屏幕适配方案,由于Android碎片化严重,屏幕适配一直是开发中较为头疼的问题.面对市面上五花八门的屏幕大小与分辨率,Android基于dp与res目录名称来适配的方案已无法满足一次编写全屏幕适配的需求,为了达到最优的视觉效果,开发过程中总是需要花费较多资源进行适配.也有开发者给出了一些自己的解决方案.首先来分析一下一些常见的解决方案的现状: 1. 官方适配方案 – dp.dp是Android开发中特有的一个单位.与px不同,dp是基于屏幕像素密度的一种单

几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm

微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合项目的特点来选择某个合适的微服务架构平台,以此稳妥地实施项目的微服务化改造或开发进程. 本文选自<架构解密:从分布式到微服务>. 本文盘点了四种常用的微服务架构方案,分别是ZeroC IceGrid.Spring Cloud.基于消息队列与Docker Swarm. ZeroC IceGrid微服

浅析2003两种快速自动登录捷径

  如何快速的进入Windows 2003操作系统呢?在本文中我们将介绍两种快速登录windows 2003操作系统的方法: 一种方法比较简单,您只需单击"开始|运行",并在输入框中键入"control userpasswords2",这样就可以在"用户账户"管理窗口中清除"要使用本机,用户必须输入密码"复选项的选中状态,然后按下键盘的"Ctrl+Shift+A",将会得到一个"自动登录"

两种快速登陆Windows Server 2003操作系统的方法

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 如何快速的进入Windows 2003操作系统呢?在本文中我们将介绍两种快速登陆Windows 2003操作系统的方法: 一种方法比较简单,您只需单击"开始|运行",并在输入框中键入"control userpasswords2",这样就可以在"用户账户"管理窗口中清除"要使用本机,用户必须输入密

浅析2003两种快速自动登录捷径_Windows2003

如何快速的进入Windows 2003操作系统呢?在本文中我们将介绍两种快速登录Windows 2003操作系统的方法: 一种方法比较简单,您只需单击"开始|运行",并在输入框中键入"control userpasswords2",这样就可以在"用户账户"管理窗口中清除"要使用本机,用户必须输入密码"复选项的选中状态,然后按下键盘的"Ctrl+Shift+A",将会得到一个"自动登录"的

如何自定义view?有没有哪种快速高效的方法?

问题描述 如何自定义view?有没有哪种快速高效的方法? 自定义view,学习的不是很全面,现在怎么可以快速实现自定义啊? 解决方案 早期:继承已经有的控件:去实现自己想要的滑动效果:也就是复写事件的拦截或者是ontouch事件. 在就是:手势集合. 完了:就不知道了. 解决方案二: 多做练习,没有捷径. 解决方案三: 比葫芦画瓢,跟现成的学,站在巨人的肩膀上.

Photoshop三种UI的选择配色方法分享

给各位Photoshop软件的使用者们来详细解析分享一下三种UI的选择配色方法. 解析分享: 方法一:色轮配色 色轮由 12 种基本的颜色组成. 首先包含的是三原色( Primary colors ),即蓝.黄.红. 原色混合产生了二次色( Secondary colors ),用二次色混合,产生了三次色( tertiary colors ). 色轮有五个同心环组成,从暗到亮-暗色处于大环,明色处于小环,而中间是颜色的基本色相.   根据颜色的关系有以下几种配色分类 a.单色配色 单色搭配就是以

当当网广告服务负责人:B2C商城的广告服务将给广告客户提供一种新的选择

[亿邦动力网讯]2月3日下午消息,当当网在其首页正式推出"广告服务",当当网广告服务负责人称:"B2C商城的广告服务将给广告客户提供一种新的选择." 当当网广告服务负责人表示,当当网的广告服务除线上的广告专区外,还包括网站的内链和外链.精准投递与直邮广告等多种广告形式.该负责人认为,直邮广告能够依靠当当网十余年的数据积累与自身建设的服务体系,进行有针对性的投递. 业内人士看来,作为网络商城,其用户群浏览网站时本身就带有消费欲望,这是电子商务网站广告的特色优势.相比于

photoshop三种快速换白底方法分享

给各位photoshop软件的使用者们来详细的分享一下三种快速换白底的方法. 方法分享:   1 替换颜色   还是这个图,调出替换颜色,习惯吸取 背景颜色,然后调节容差范围,保证产品 全是黑色,背景是白色,并且界限分明, 然后最下面的明度调到最大值,然后,没 有然后了. 2 可选颜色   凡是无绝对,如果有的产品上有白色或者 浅色,再用上面替换颜色那种方法会出现不 管怎么调都无法产品全白,强行明度调白就 会再白色部位出现曝光过度,死白.这种情 况可以换用可选颜色.   可选颜色里白色,然后最后