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();
			//Byte
			if((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.mfbz.cn/a/585363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【氮化镓】一种新型的p-GaN/p-AlGaN/AlGaN/GaN异质结场效应晶体管

文章由韩国首尔弘益大学电子与电气工程学院的Dong-Guk Kim等人撰写&#xff0c;题为“P-GaN/p-AlGaN/AlGaN/GaN heterojunction field-effect transistor with a threshold voltage of 6 V”&#xff0c;发表在IEEE Electron Device Letters上。文章提出了一种新型的p-GaN/p-Al…

HTTP:强缓存优化实践

强缓存&#xff1a;浏览器不会向服务器发送任何请求&#xff0c;直接从本地缓存中读取文件 强缓存是指浏览器在向服务器请求资源时&#xff0c;判断本地是否存在该资源的缓存&#xff0c;并判断是否过期。 如果本地缓存未过期&#xff0c;浏览器就直接使用本地缓存&#xff0c…

C#基础|了解对象在程序中的状态及垃圾回收机制

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 本节了解对象的生命周期及对象状态和垃圾回收机制&#xff0c;以下为学习笔记。 1、对象的生命周期 对象在内存中不断地被引用&#xff0c;被释放&#xff0c;形成了类似生命周期的过程。 2、对象在内存中的状态 对…

【2024新windows电脑部署测试环境系列】Jenkins部署 (上)

jenkins对我们测试来说挺重要的&#xff0c;持续集成cicd ,定时任务&#xff0c;远程控制&#xff0c;打包部署测试环境等等。虽然在一些公司&#xff0c;早已用上自研的这种综合控制平台&#xff0c;不过也至少9成以上的组织还是在用jenkins。 一个公司并不一定只有一个jenkin…

一文解决ArcGIS生成点和管段 含案例讲解

背景 在工作中&#xff0c;我们经常遇到要将坐标数据导入 GIS&#xff0c;生成点位&#xff0c;若是地理坐标系&#xff08;经纬度&#xff09;&#xff0c;那么直接用 arcgis或者QGIS 导入数据就行了&#xff0c;可实际中总会遇到各种问题&#xff1a; 坐标数据集为大地 200…

(三十二)第 5 章 数组和广义表(稀疏矩阵的十字链表存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

latex使用bib引用参考文献时,正文编号顺序乱序解决办法,两分钟搞定!

一、背景 用Latex写文章时&#xff0c;使用bib添加参考文献是一种最为简便的方式。但有的期刊模板&#xff0c;如机器人顶会IROS&#xff0c;会出现正文参考文献序号没按顺序排列的情况&#xff0c;如下图所示。按理说文献[4]应该是文献[2]&#xff0c;[2]应该是[3]&#xff0…

现代机器学习(ML)技术在医疗成像领域的新应用

现代机器学习(ML)技术在医疗成像领域的新应用主要包括以下几个方面: 一、自动病变检测 使用深度学习算法,尤其是卷积神经网络(CNN),自动识别和分类医学影像中的病变,如肿瘤、炎症等。自动病变检测是现代机器学习技术在医疗成像领域应用的一个重要方向。它主要通过以下…

spark实验求TOP值

实验1&#xff1a;求TOP值 已知存在两个文本文件&#xff0c;file1.txt和file2.txt&#xff0c;内容分别如下&#xff1a; file1.txt 1,1768,50,155 2,1218, 600,211 3,2239,788,242 4,3101,28,599 5,4899,290,129 6,3110,54,1201 7,4436,259,877 8,2369,7890,27 fil…

K8S 哲学 - deployment -- kubectl【create 、 rollout 、edit、scale、set】

kubectl create kubectl rollout kubectl edit kubectl set kubectl scale 1、创建与配置文件解析 2、deploy 滚动更新 &#xff1a;template 里面的内容改变触发滚动更新 编辑该 deploy 的 配置文件 &#xff0c;加入一个 label 不会触发滚动更新 改变 nginx镜…

HTML批量文件上传方案——图像预览方式

作者:私语茶馆 1.HTML多文件上传的关键方案 多文件上传包括:文件有效性校验,文件预览、存储和进度展示多个方面,本章节介绍的是文件预览的实现方案。 2.文件上传前预览 2.1.效果 选择文件前: 选择文件后: 2.2.CSS文件代码 StorageCenter.css代码 html {font-family:…

刚刚!MySQL8.4.0 LTS发布,接着再探

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

郡望是一个什么性质的概念

顾名思义&#xff0c;郡望就是某郡中的望族。 别看现在听起来没什么感觉&#xff0c;在古代却是一个沉甸甸的庞然大物&#xff0c;是标志贵贱的&#xff0c;决定了个人&#xff0c;家庭和家族的未来。 自秦朝实行郡县制&#xff0c;直到唐朝废郡&#xff0c;郡做为一级或州管的…

【AIGC调研系列】LLaVA++整合Phi-3和Llama-3能够实现什么

LLaVA能够为Phi-3和Llama-3带来的主要好处包括&#xff1a; 视觉处理能力的增强&#xff1a;通过整合Phi-3和Llama-3模型&#xff0c;创建了具备视觉处理能力的Phi-3-V和Llama-3-V版本&#xff0c;这意味着这些模型现在能够理解和生成与图像相关的内容[1]。这种能力的增加&…

浅论汽车研发项目数字化管理之道

随着汽车行业竞争不断加剧&#xff0c;汽车厂商能否快速、高质地推出贴合市场需求的新车型已经成为车企竞争的重要手段&#xff0c;而汽车研发具备流程复杂、专业领域多、协作难度大、质量要求高等特点&#xff0c;企业如果缺少科学健全的项目管理体系&#xff0c;将会在汽车研…

如何查看我的Docker 容器和 `app.py` 脚本有足够的权限来读取 `config.json` 文件

要检查 Docker 容器和 app.py 脚本是否具有读取 config.json 文件的足够权限&#xff0c;你可以按照以下步骤操作&#xff1a; 检查宿主机上的文件权限&#xff1a; 在宿主机上&#xff0c;使用 ls -l 命令查看 config.json 文件的权限。 ls -l /path/to/config.json确保该文件…

从车规传感器发展的正反面,看智驾发展的“胜负手”

北京车展进程过半&#xff0c;雷军和周鸿祎成为车展新晋“网红”的同时&#xff0c;智能驾驶成为观众讨论最务实的话题之一。端到端自动驾驶、城市NOA这些炙手可热的话题&#xff0c;占据了大部分的关注度。 但在高阶智能驾驶之外&#xff0c;智能驾驶同样具有频繁使用需求的低…

实验案例一:在一台交换机上配置 VLAN

1.实验环境 实验拓扑图结构如图12.12所示&#xff0c;其中PC1和PC3属于VLAN 2&#xff0c;PC2属于VLAN 3&#xff0c;PC1的IP 地址为192.168.0.2/24&#xff0c;PC2的P 地址为 192.168.1.2/24&#xff0c;PC3的P地址为192.168.0.3/24 2.需求描述 要求处于相同VLAN中的主机能够…

CSS的布局模式

前言&#xff1a; 我们可以看到京东的官网上的一些例子&#xff08;如下图&#xff09;&#xff0c;在同一排中能够存在多个div&#xff0c;这是通过布局方式&#xff08;例如浮动&#xff09;来实现的。 CSS传统的布局模式&#xff1a; <1>普通流&#xff08;又称之为标…

Codeforces Round 928 (Div. 4) F. Vlad and Avoiding X

Vlad and Avoiding X 题目描述 弗拉迪斯拉夫有一个大小为 7 7 7 \times 7 77 的网格&#xff0c;其中每个单元格的颜色都是黑色或白色。在一次操作中&#xff0c;他可以选择任意一个单元格并改变其颜色&#xff08;黑色 ↔ \leftrightarrow ↔ 白色&#xff09;。 请找出…
最新文章