C# Web控件与数据感应之 CheckBoxList 类

目录

关于数据感应

CheckBoxList 类

范例运行环境

数据源表设计

角色字典表

用户角色表

AutoValueDBList 方法

原理

设计

实现

调用示例

初始化数据

启动查询模式

使用保存模式

小结


关于数据感应

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,本文将继续介绍与数据库提取数据并捆绑到 CheckBoxList 类控件为例,另外同时将控件的值保存回数据库的通用方法。

CheckBoxList 类

System.Web.UI.WebControls.CheckBoxList 类是提供了一组可复选的选项集合,每个选项以true或false 表示其选中状态。其使用方法基于 ListControl 类。

更多 CheckBoxList 类的介绍请参照如下链接:

https://learn.microsoft.com/zh-cn/previous-versions/visualstudio/design-tools/expression-studio-2/cc294907(v=expression.10)

范例运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

数据提取:在这里我们以MS SQL Server 2016为例

数据源表设计

我们假设要为用户添加角色权限,则需要涉及两个表:

角色字典表

表(sys_chars)用于列出可用的角色,其结构如下:

序号字段名类型说明备注
1ciduniqueidentifier唯一ID用于后续方法使用
2charnamenvarchar(30)角色名称

其数据示例如下:

用户角色表

表(sys_UserChars)用于存储用户的可用角色(用户ID+角色ID 唯一),其结构如下:

序号字段名类型说明备注
1user_ciduniqueidentifier用户ID用户的ID值
2char_ciduniqueidentifier角色名称用记所属的角色ID值

其示例数据如下:

AutoValueDBList 方法

原理

我们需要提取 sys_chars (角色字典表) 数据绑定到 CheckBoxList 控件上,用于显示可用的角色名称。绑定后通过 AutoValueDBList 方法的查询模式,从 sys_UserChars (用户角色表)提取数据并与 CheckBoxList 上的项进行比对,存在的则选中。同理,使用 AutoValueDBList 方法的保存模式,则将用户在 CheckBoxList 上的选项逐一保存到 sys_UserChars (用户角色表)里。

设计

AutoValueDBList 方法主要分查询模式和保存模式,在保存模式的情况下返回成功影响的行数,其参数说明如下表:

序号参数名类型说明
1strConnstring对应数据库的连接字符串
2_objectListControl要感应的 ListControl 类控件,这里泛指 CheckBoxList
3AutoTypestring

两种值可选择,“query” 为查询模式,“save” 为保存模式

4keyFieldTypestring

连接的目标表的关键字字段类型,如 uniqueidentifier,比如sys_UserChars 中的 user_cid 字段类型

5linkKeyValuestring连接的目标表的关键字段的值,比如sys_UserChars 中的 user_cid 字段的值
6Tablenamestring要连接的目标表比如 sys_UserChars
7KeyFieldstring连接的目标表的关键字字段名,比如sys_UserChars 中的字段 “user_cid” 
8KeyField2string连接的目标表的第二关键字字段名,比如sys_UserChars 中的字段 “char_cid” 
9CidFieldNamestring指定连接目标表的唯一标识字段名,这里仅允许使用 uniqueidentifier 的类型字段,如无则默认不参于 insert 操作,设置则表示其值为 newid()

实现

AutoValueDBList 方法完整代码如下:

public int AutoValueDBList(string strConn,ListControl _object,string AutoType,string keyFieldType,string linkKeyValue,string Tablename,string KeyField,string KeyField2,string CidFieldName)
{int rv=-1;SqlDbType type=GetSqlDbType(keyFieldType);SqlConnection Conn = new SqlConnection(strConn );SqlCommand Cmd = new SqlCommand();Cmd.Connection = Conn;if(AutoType=="save"){Cmd.CommandText = " delete from "+Tablename+" where "+KeyField+"=@"+KeyField;SqlParameter   para1=new SqlParameter("@"+KeyField,type);para1.Value=(keyFieldType.ToLower()=="uniqueidentifier"?(object)(new Guid(linkKeyValue)):(object)linkKeyValue);Cmd.Parameters.Add(para1);try{Conn.Open();Cmd.ExecuteNonQuery();Cmd.CommandText = " insert into "+Tablename+"("+KeyField+","+KeyField2+") values(@"+KeyField+",@"+KeyField2+")";if(CidFieldName!=""){Cmd.CommandText = " insert into "+Tablename+"("+CidFieldName+","+KeyField+","+KeyField2+") values(newid(),@"+KeyField+",@"+KeyField2+")";}SqlParameter   para2=new SqlParameter("@"+KeyField2,type);Cmd.Parameters.Add(para2);int success=0;for(int i=0;i<_object.Items.Count;i++){string _value=_object.Items[i].Value;if(!_object.Items[i].Selected){continue;}para2.Value=(keyFieldType.ToLower()=="uniqueidentifier"?(object)(new Guid(_value)):(object)_value);int si=Cmd.ExecuteNonQuery();success+=si;}return success;}catch (Exception ex){return rv;}finally{Conn.Close();Conn.Dispose();}}if(AutoType=="query"){SqlDataReader myDr;Cmd.CommandText = " select "+KeyField2+" from "+Tablename+" where "+KeyField+"=@"+KeyField;SqlParameter   para1=new SqlParameter("@"+KeyField,type);para1.Value=(keyFieldType.ToLower()=="uniqueidentifier"?(object)(new Guid(linkKeyValue)):(object)linkKeyValue);Cmd.Parameters.Add(para1);try{Conn.Open();myDr=Cmd.ExecuteReader();for(int i=0;i<_object.Items.Count;i++){_object.Items[i].Selected=false;}rv=0;while(myDr.Read()){rv++;string _dbkey=myDr[KeyField2].ToString();for(int i=0;i<_object.Items.Count;i++){string _value=_object.Items[i].Value;if(_value==_dbkey){_object.Items[i].Selected=true;}}}}catch (Exception ex){return rv;}finally{Conn.Close();Conn.Dispose();}}return rv;}public SqlDbType GetSqlDbType(String TypeInfo) 
{TypeInfo=TypeInfo.ToLower();//Byteif((TypeInfo=="varchar")||(TypeInfo=="system.string")){return SqlDbType.VarChar;}if((TypeInfo=="bigint")||(TypeInfo=="system.int64")){return SqlDbType.BigInt;}if((TypeInfo=="binary")||(TypeInfo=="system.byte[]")){return SqlDbType.Binary;}if((TypeInfo=="bit")||(TypeInfo=="system.boolean")){return SqlDbType.Bit;}if((TypeInfo=="char")||(TypeInfo=="system.char")){return SqlDbType.Char;}if((TypeInfo=="datetime")||(TypeInfo=="system.datetime")){return SqlDbType.DateTime;}if((TypeInfo=="decimal")||(TypeInfo=="system.decimal")){return SqlDbType.Decimal;}if((TypeInfo=="float")||(TypeInfo=="system.double")){return SqlDbType.Float;}if(TypeInfo=="image"){return SqlDbType.Image;}if((TypeInfo=="int")||(TypeInfo=="system.int32")){return SqlDbType.Int;}if((TypeInfo=="money")||(TypeInfo=="system.decimal")){return SqlDbType.Money;}if(TypeInfo=="nchar"){return SqlDbType.NChar;}if(TypeInfo=="ntext"){return SqlDbType.NText;}if(TypeInfo=="nvarchar"){return SqlDbType.NVarChar;}if((TypeInfo=="real")||(TypeInfo=="system.single")){return SqlDbType.Real;}if(TypeInfo=="smalldatetime"){return SqlDbType.SmallDateTime;}if((TypeInfo=="smallint")||(TypeInfo=="system.int16")){return SqlDbType.SmallInt;}if(TypeInfo=="smallmoney"){return SqlDbType.SmallMoney;}if(TypeInfo=="text"){return SqlDbType.Text;}if((TypeInfo=="timestamp")||(TypeInfo=="system.timespan")){return SqlDbType.Timestamp;}if((TypeInfo=="tinyint")||(TypeInfo=="system.byte")){return SqlDbType.TinyInt;}if((TypeInfo=="uniqueidentifier")||(TypeInfo=="system.guid")){return SqlDbType.UniqueIdentifier;}if(TypeInfo=="varbinary"){return SqlDbType.VarBinary;}if(TypeInfo=="variant"){return SqlDbType.Variant;}return SqlDbType.VarChar;
}// end GetSqlDbType function 	

调用示例

初始化数据

假设前端 UI 有 ID  为 CBL 的 CheckBoxList 控件,则调用的示例代码如下: 

simpleDataListEx("sqlserver","数据库连接串","select cid, charname from sys_chars", null, "cid", "charname", CBL, false, "", "","");

有关 simpeDataListEx 的使用方法请阅读我的文章《C# Web控件与数据感应之 Control 类》。 

启动查询模式

初始化完成后,启动 AutoValueDBList 方法的查询模式,进行比对操作。示例代码如下:

string user_cid_value="1F044A84-9154-466B-9B9F-894282625729";
AutoValueDBList("你的数据库连接串",CBL, "query", "uniqueidentifier", user_cid_value, "sys_userchars", "user_cid", "char_cid");

使用保存模式

当用户重新进行复选操作时,可以将结果提交给数据库进行保存。示例代码如下:

string user_cid_value="1F044A84-9154-466B-9B9F-894282625729";
AutoValueDBList("你的数据库连接串",CBL,"save","uniqueidentifier",user_cid_value,"sys_userchars","user_cid","char_cid","cid");

小结

范例中使用的MS SQL SERVER 数据库,我的下载资源还提供了 Oracle 9i及达梦数据库的驱动链接库,请下载我的资源:

https://download.csdn.net/download/michaelline/89235824

我们可以根据需要改造方法,另外 AutoValueDBList 方法基于 ListControl 类,我们可以根据实际的需要进行使用和改造。感谢您的阅读,希望本文能够对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker学习】docker version查看版本信息

就像很多应用一样&#xff0c;docker也使用version来查看版本信息。但因为docker包含有不少独立组件&#xff0c;version的作用范围会更广一些。 用法1&#xff1a; docker --version 描述&#xff1a; 输出安装的Docker CLI 的版本号。关于Docker CLI&#xff0c;请访问。 实操…

项目管理-项目范围管理2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 项目范围管理&#xff0c;过程 6个&#xff0c;包括“规收定 创确控”&#xff1a; 规划范围管理收集需求定义范围创建WBS确认范围控制…

怎么证明E[E(X|Y,Z)Y]= E(X|Y)

性质8的证明 物理意义

webpack基础---常用loader

webpack 命令式和配置文件 html-webpack-plugin 配置项&#xff1a;{ templete: filename: inject: } 清除上次打包的文件&#xff0c;output: { clear: true } mode选项&#xff1a; none development prodution souce-map&#xff1a;可以精准定位代码行数 { devt…

【Android学习】简易计算器的实现

1.项目基础目录 新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。 另外 themes.xml中原来的 <style name"Theme.Learn" parent"Theme.MaterialComponents.DayNight.DarkActionBar">变为了&#xff0c;加上后可针对button中增加图片…

发卡授权盗u系统源码ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c; 搭建系统TGaqxm01&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.s…

Spring Boot中使用Redis和Lua脚本实现延时队列

码到三十五 &#xff1a; 个人主页 延时队列是一种常见的需求。延时队列允许我们延迟处理某些任务&#xff0c;这在处理需要等待一段时间后才能执行的操作时特别有用&#xff0c;如发送提醒、定时任务等。文中&#xff0c;将介绍如何在Spring Boot环境下使用Redis和Lua脚本来实…

吴恩达机器学习笔记 三十七 电影推荐系统 使用特征 成本函数 协同过滤算法

以电影评分系统为例&#xff0c;令 r(i, j) 来表示用户 j 已经对电影 i 评分&#xff0c; y&#xff08;i, j&#xff09;表示评分具体是多少。 假如每部电影有自己的特征&#xff0c;那么用户 j 对电影 i 的评分预测为 w(j) * x(i) b(j) r(i, j) &#xff1a;一个用户 j 是否…

global IoT SIM解决方案

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). Onomondo提供的全球IoT SIM卡解决方案具有以下特点和优势&#xff1a; 1. **单一全球配置文件**&#xff1a;Onomondo的SIM卡拥…

Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析

背景 在上一篇的博客里&#xff0c;大致介绍了flink checkpoint中的触发的大体流程&#xff0c;现在介绍一下触发之后下游的算子是如何做snapshot。 上一篇的文章: Flink checkpoint 源码分析- Flink Checkpoint 触发流程分析-CSDN博客 代码分析 1. 在SubtaskCheckpointCoo…

Vue3+ts(day05:ref、props、生命周期、hook)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

开源AI智能名片S2B2C商城系统:移动技术的深度整合与应用

在数字化营销的新时代&#xff0c;开源AI智能名片S2B2C商城系统通过深度整合移动技术MAC ID、Beacon和DSP&#xff0c;为企业带来了前所未有的营销机遇。这一系统不仅提高了营销效率&#xff0c;还极大地提升了客户体验&#xff0c;并有效降低了营销成本。下面&#xff0c;我们…

【JAVA基础之反射】反射详解

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 1.反射 1.1 概述 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它…

SQL注入漏洞扫描---sqlmap

what SQLMap是一款先进的自动执行SQL注入的审计工具。当给定一个URL时&#xff0c;SQLMap会执行以下操作&#xff1a; 判断可注入的参数。判断可以用哪种SQL注入技术来注入。识别出目标使用哪种数据库。根据用户的选择&#xff0c;读取哪些数据库中的数据。 更详细语法请参考…

BJFUOJ-C++程序设计-实验3-继承和虚函数

A TableTennisPlayer 答案&#xff1a; #include<iostream> #include<cstring> using namespace std;class TableTennisPlayer{ private:string firstname;string lastname;bool hasTable;public:TableTennisPlayer(const string &, const string &, bool…

leetCode65. 有效数字

leetCode65. 有效数字 题目思路 代码 class Solution { public:bool isNumber(string s) {int l 0, r s.size() - 1;// 1.忽略前后的空格while(l < r && s[l] ) l;while(l < r && s[r] ) r--;if(l > r) return false;s s.substr(l,r - l 1)…

Git的基本操作和使用

git分支指令 列出所有本地分支 git branchmaster是绿的 前面有个 表示当前分支是master* 列出所有远程分支 git branch -r列出所有本地分支和远程分支 git branch -a新建一个分支&#xff0c;但依然停留在当前分支 git branch [branch-name]新建一个分支&#xff0c;并切…

httpcanary抓包某游戏思路及教程[第1期]

游戏介绍&#xff1a; 这期在线读档0花购买教程&#xff0c;存档版教程。下一期在线购买无限鲜花累计充值安卓全系统适配修改教程。 小白勿入&#xff0c;技术流资料 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#x…

设计模式动态代理

什么是设计模式? 一个问题通常有n种解法&#xff0c;其中肯定有一种解法是最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。 设计模式有20多种&#xff0c;对应20多种软件开发中会遇到的问题。 关于设计模式的学习&#xff0c;主要学什么&#…

onedrive下載zip檔案有20G限制,如何解決

一般來說&#xff0c;OneDrive網頁版對文件下載大小的限制如下圖所示&#xff0c;更多資訊&#xff0c;請您參考這篇文章&#xff1a;OneDrive 和 SharePoint 中的限制 - Microsoft Support 因此我們推薦您使用OneDrive同步用戶端來同步到本地電腦&#xff0c;您也可以選擇只同…