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

news2024/9/20 1:15:06

目录

关于数据感应

Control 类

范例运行环境

simpleDataListEx方法

设计

实现

调用示例

数据源

调用

小结


关于数据感应

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,诸如 ListControl 类类型控件,在我的文章《C# Web控件与数据感应之 ListControl 类》 里有详细的介绍。本文将继续介绍以与数据库提取数据并捆绑控件为例,讲解 C# 创建适用于 Control 类的更加广泛兼容的通用方法。

Control 类

Control 类是包括自定义控件、用户控件和页在内的所有 ASP.NET 服务器控件的基类,System.Web.UI.HtmlControls、System.Web.UI.WebControls 等都是从此基类中派生。在这里我们以 Control 类的实例化控件进行判断用户的控件类型,以决定其绑定数据后的显示设置方式。

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

https://learn.microsoft.com/zh-cn/previous-versions/dotnet/netframework-1.1/983zwx2h(v=vs.80)

范例运行环境

操作系统: Windows Server 2019 DataCenter

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

开发工具:VS2019  C#

数据提取:在这里我们以能够支持 Oracle 9i、MS SQL Server 2016、国产达梦数据 8 的通用数据库内容提取方法为例, 生成数据源需要利用 ADO.NET 中的数据提供者对象包括IDbConnection、IDbCommand、IDbDataParameter等,如何使用这些对象请参考我的文章:

《C#实现 IDbConnection / IDbCommand 等相关通用数据接口》

simpleDataListEx方法

设计

simpleDataListEx 方法可以下达SQL命令及配置相关参数,将数据源感应到指定的 Control 类控件上,其参数说明如下表:

序号参数名类型说明
1DbServerTypestring目前支持 "oracle"、 "dm8",其它字符串均视为 MS SQL Server
2strConnstring对应数据库的连接字符串
3sqlstring要执行的SQL语句命令行
4parasArrayList

要赋值的参数对象,逐个添加到ArrayList里,请注意参数为实体数据参数对象,如 MS SQL Server ,请传递如下代码:

ArrayList.Add(new SqlParameter("参数名",参数值)); 

5keyfieldstring

提取数据源成功时,用于捆绑ListItem.Value 的字段名

6displayfieldstring提取数据源成功时,用于捆绑ListItem.Text 的字段名
7_objectSystem.Web.UI.WebControls.Control要捆绑的目标 Control 对象,方法将根据控件类型判断,以决定如何进行赋值,此说明将再后续表格进行说明
8allownullbool是否允许添加一个空项,指捆绑成功后是否还需要添加一个空项,该空项会自动增加到第一个选项(如Value为空,Text 显示为 “未选择” ),且处于默认选择状态,否则会自动默认为数据源的第一个选项
9allownullvaluestring当允许添加一个空项时(allownull为true),指定空项存储的 Value 值
10allownulltextstring当允许添加一个空项时(allownull为true),指定空项存储的 Text 值
11defaultvaluestring指定一个默认查找值,当数据源绑定后进行二次查找且定位

对于 System.Web.UI.WebControls.Control _object 的解析判断如下表:

实现

simpleDataListEx 方法完整代码如下:

public string simpleDataListEx(string DbServerType,string strConn,string sql,ArrayList paras,string keyfield,string displayfield,System.Web.UI.Control _object,bool allownull,string allownullvalue,string allownulltext,string defaultvalue)
{
			string rv="";
			string strConn =ConfigurationSettings.AppSettings[ConnKeyString];
			if(ConnString!="")
			{
				strConn=ConnString;
			}
			System.Data.IDbConnection Conn=GetConnection(DbServerType,strConn);
			System.Data.IDbCommand Cmd=GetCommand(DbServerType,sql,paras,Conn);
			System.Data.IDataReader myDr=GetDataReader(DbServerType);
			try
			{
				Conn.Open();
                if (DbServerType.ToLower() == "dm8")
                {
                    myDr = Cmd.ExecuteReader() as DmDataReader;
                }
                else
                {
                    myDr = Cmd.ExecuteReader();
                }
                if (_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlGenericControl))
				{
					if(myDr.Read())
						((System.Web.UI.HtmlControls.HtmlGenericControl)_object).InnerText=myDr[keyfield].ToString();
				}
				if(_object.GetType()==typeof(System.Web.UI.WebControls.Label))
				{
					if(myDr.Read())
						((System.Web.UI.WebControls.Label)_object).Text=myDr[keyfield].ToString();
				}
				if(_object.GetType()==typeof(System.Web.UI.WebControls.TextBox))
				{
					if(myDr.Read())
						((System.Web.UI.WebControls.TextBox)_object).Text=myDr[keyfield].ToString();
				}
				if(_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlInputText))
				{
					if(myDr.Read())
					((System.Web.UI.HtmlControls.HtmlInputText)_object).Value=myDr[keyfield].ToString();
				}
				if(_object.GetType()==typeof(System.Web.UI.WebControls.DropDownList))
				{
					((System.Web.UI.WebControls.DropDownList)_object).DataSource = myDr;
					((System.Web.UI.WebControls.DropDownList)_object).DataTextField = displayfield;
					((System.Web.UI.WebControls.DropDownList)_object).DataValueField = keyfield;
				}
				if(_object.GetType()==typeof(System.Web.UI.WebControls.ListBox))
				{
					((System.Web.UI.WebControls.ListBox)_object).DataSource = myDr;
					((System.Web.UI.WebControls.ListBox)_object).DataTextField = displayfield;
					((System.Web.UI.WebControls.ListBox)_object).DataValueField = keyfield;
				}
				if(_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlSelect))
				{
					((System.Web.UI.HtmlControls.HtmlSelect)_object).DataSource = myDr;
					((System.Web.UI.HtmlControls.HtmlSelect)_object).DataTextField = displayfield;
					((System.Web.UI.HtmlControls.HtmlSelect)_object).DataValueField = keyfield;
				}
				_object.DataBind();
				myDr.Close();

			}
			catch (Exception e)
			{
				rv=e.Message;
			}
			finally
			{
				Conn.Close();
				Conn.Dispose();
			}
			if(allownull)
			{

				if(_object.GetType()==typeof(System.Web.UI.WebControls.DropDownList))
				{
					((System.Web.UI.WebControls.DropDownList)_object).Items.Insert (0,new ListItem(allownulltext,allownullvalue));
					((System.Web.UI.WebControls.DropDownList)_object).SelectedIndex=((System.Web.UI.WebControls.DropDownList)_object).Items.IndexOf(((System.Web.UI.WebControls.DropDownList)_object).Items.FindByValue(defaultvalue));
				}
				if(_object.GetType()==typeof(System.Web.UI.WebControls.ListBox))
				{
					((System.Web.UI.WebControls.ListBox)_object).Items.Insert (0,new ListItem(allownulltext,allownullvalue));
					((System.Web.UI.WebControls.ListBox)_object).SelectedIndex=((System.Web.UI.WebControls.ListBox)_object).Items.IndexOf(((System.Web.UI.WebControls.ListBox)_object).Items.FindByValue(defaultvalue));
				}
				if(_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlSelect))
				{
					((System.Web.UI.HtmlControls.HtmlSelect)_object).Items.Insert (0,new ListItem(allownulltext,allownullvalue));
					((System.Web.UI.HtmlControls.HtmlSelect)_object).SelectedIndex=((System.Web.UI.HtmlControls.HtmlSelect)_object).Items.IndexOf(((System.Web.UI.HtmlControls.HtmlSelect)_object).Items.FindByValue(defaultvalue));
				}
			}
			return rv;
}//simpleDataListEx



public System.Data.IDbConnection GetConnection(string DbServerType,string ConnectionString)
{
			IDbConnection con = null;
			switch (DbServerType.ToLower())
			{
				case "oracle":
					con = new OracleConnection(ConnectionString);break;
                case "dm8":
                    con = new DmConnection(ConnectionString); break;
                default:
					con = new SqlConnection(ConnectionString);   break;
			}
			return con;

}
public IDbCommand GetCommand(string dbservertype,string cmdText,ArrayList paras,IDbConnection con)
{
			IDbCommand cmd = null;
			switch (dbservertype.ToLower())
			{
				case "oracle": cmd = new OracleCommand(cmdText,(OracleConnection)con);
					break;
                case "dm8":
                    cmd = new DmCommand(cmdText, (DmConnection)con);
                    break;
                default:    cmd = new SqlCommand(cmdText,(SqlConnection)con);        break;
			}
			if(paras!=null)
			{
				for(int i=0;i<paras.Count;i++)
				{
					cmd.Parameters.Add(GetParameter(dbservertype,paras[i]));
				}
			}
			return cmd;
}
public System.Data.IDbDataParameter GetParameter(string dbservertype,object paras)
{
			IDbDataParameter para = null;
			switch (dbservertype.ToLower())
			{

				case "oracle": para =(OracleParameter)paras; 
					break;
                case "dm8":
                    para =  (DmParameter)paras;
                    break;
                default: para =(SqlParameter)paras; break;
			}
			return para;
}

调用示例

数据源

我们以 MS SQL SERVER 为例,提取某一项目ID的可选择人员类型列表,如下图数据显示:

表(pub_type)设计基本情况如下表:

序号字段名类型说明备注
1xm_ciduniqueidentifier项目ID
2valuenvarchar(100)存储的值
3textnvarchar(100)存储的显示值用户可以看到的选择时的呈现值
4sortidint排序号

调用

假设前端 UI 有 ID 为 TB 的 TextBox (文本框) 控件 和 ID 为 DDL 的 DropDownList (下拉列表框) 控件,则调用的示例代码如下: 

ArrayList paras = new ArrayList();
string xm_cid="E5FB9BF5-6CB6-4792-B105-C4453028925D"; //项目ID
paras.Add(new SqlParameter("@cid", xm_cid));
simpleDataListEx("sqlserver","数据库连接串","select value,text from pub_type where xm_cid=@cid order by sortid", paras, "text", "value", TB, true, "", "","");
simpleDataListEx("sqlserver","数据库连接串","select value,text from pub_type where xm_cid=@cid order by sortid", paras, "text", "value", DDL, true, "", "","");

显示结果如下图:

 

从图中我们可以看出,对于文本框只提取第一条记录的Value值 ,对于可单选项的下拉列表框可以显示多条记录。 

小结

范例中所需数据库驱动链接库,请下载我的资源:

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

本方法适用于所以对应说明表中的 Control 类类型控件,我们可以根据自己的实际需要扩充范围类型的控件和改造符合自己要求的功能,感谢您的阅读,希望本文能够对您有所帮助。

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

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

相关文章

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中&#xff0c;地图功能是一个非常常见且实用的功能&#xff0c;可以帮助用户快速定位并浏览周边信息。而在uni-app开发中&#xff0c;使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项&#xff0c;帮助开发者顺利完成地图功能…

万兆以太网MAC设计(12)万兆UDP协议栈上板与主机网卡通信

文章目录 一、设置IP以及MAC二、上板效果2.1、板卡与主机数据回环测试2.2、板卡满带宽发送数据 一、设置IP以及MAC 顶层模块设置源MAC地址 module XC7Z100_Top#(parameter P_SRC_MAC 48h01_02_03_04_05_06,parameter P_DST_MAC 48hff_ff_ff_ff_ff_ff )(input …

excel图表如何忽略空值呢?

在excel柱形图和折线图中有多余的空值&#xff0c;如何不把空值当成0值处理&#xff0c;可以达到第二个图的效果? 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 用的excel2019已经是自动将这些空值忽略了&#xff0c;在低版本上&#xff0c;是会将空值…

2024年想创业做电商,视频号小店绝对是最明智的选择!

大家好&#xff0c;我是电商糖果 在电商行业摸爬滚打了七年时间了&#xff0c;做过天猫&#xff0c;京东&#xff0c;闲鱼。 目前在做的项目只有两个&#xff0c;一个是抖音小店&#xff0c;已经做了四年多了。 另一个就是视频号小店&#xff0c;现在做了有一年多了。 视频…

力扣HOT100 - 79. 单词搜索

解题思路&#xff1a; 深度优先搜索&#xff08;DFS&#xff09; 剪枝。 class Solution {public boolean exist(char[][] board, String word) {char[] words word.toCharArray();for(int i 0; i < board.length; i) {for(int j 0; j < board[0].length; j) {if (df…

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下&#xff1a; Dockerhttps://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本&#xff0c;先拉取镜像。命令如下&#xff1a; docker pull redis:6.2.14 查看刚刚下载的镜像&am…

冯喜运:4.30现货黄金涨跌互现,最新黄金原油趋势分析

【黄金消息面分析】&#xff1a;上周五公布的数据&#xff0c;美国3月核心PCE年率维持前值不变&#xff0c;美国4月一年期通胀率预期上升&#xff0c;显示通胀顽固并有所回升&#xff0c;但其经济数据美国3月个人支出月率和美国4月密歇根大学消费者信心指数终值则低于预期和前值…

ABeam德硕受邀参加第四届碳交易与ESG投资合作发展大会并荣获2024 ESG“前沿奖”

ABeam荣获2024 ESG“前沿奖”&#xff0c;ABeam大中华区董事长兼总经理中野洋辅先生上台领奖 ABeam ESG News 3月28日&#xff0c;由中国金融前沿论坛&#xff08;CFAF&#xff09;主办&#xff0c;ABeam Consulting、MSCI、BCG、中金公司、方达律师事务所等合作协办的第四届…

Java包装类,128陷阱

包装类 基本数据类型都有自己对应的包装类&#xff0c;因为Java本质是面向对象编程的&#xff0c;一切的内容在Java看来都是对象 但是基本数据类型没有类&#xff0c;也没有对象&#xff0c;这样就有了矛盾 所以诞生了基本类型的包装类 基本数据类型&#xff1a; byte,short,…

Spring AI 来啦,快速上手

Spring AI Spring框架在软件开发领域&#xff0c;特别是在Java企业级应用中&#xff0c;一直扮演着举足轻重的角色。它以其强大的功能和灵活的架构&#xff0c;帮助开发者高效构建复杂的应用程序。而Spring Boot的推出&#xff0c;更是简化了新Spring应用的初始搭建和开发过程…

(超全)python图像处理详细解析(1)

图像处理 skimage包的子模块1.读取图像2.图像灰度处理3.加载程序自带图像4.查看存储路径5.保存图片6.图片信息7.输出小猫图片的G通道中的第20行30行列的像素值8.显示红色单通道图片9.对小猫图片添加椒盐噪声10.高斯去噪11.中值滤波去噪12.随机生成噪声点13.对小猫图像进行裁剪1…

vue报错:Do not mutate vuex store state outside mutation handlers.

vue报错&#xff1a;Do not mutate vuex store state outside mutation handlers. 原因&#xff1a;在vuex store的state外部直接修改了state的值&#xff0c;但是Vuex要求所有的state的修改必须在vuex中&#xff0c;不允许直接咋组件中修改store中的状态&#xff0c;除非通过m…

ios CI/CD 持续集成 组件化专题五-(自动发布私有库-组件化搭建)

一&#xff1a;手动发布私有库总结 手动发布pod私有库&#xff0c;需要进行如下几步操作&#xff1a; 1、修改完代码之后&#xff0c;需要提交代码push到git仓库。 2、给代码打tag。 3、修改podspec文件的version值&#xff0c;使其和设置的tag一直。 4、命令行执行pod repo…

【Java EE】日志框架(SLF4J)与门面模式

文章目录 &#x1f340;SLF4j&#x1f333;门面模式(外观模式)&#x1f338;门面模式的定义&#x1f338;门面模式的模拟实现&#x1f338;门面模式的优点 &#x1f332;关于SLF4J框架&#x1f338;引入日志门面 ⭕总结 &#x1f340;SLF4j SLF4J不同于其他⽇志框架,它不是⼀个…

分子动力学模拟学习-Gromacs工具链

1、总体流程 在gromacs的使用说明中有一个flow chart&#xff0c;比较简略。以下针对一般体系&#xff08;非蛋白等领域&#xff09;进行了一些调整&#xff0c;通用性更强。 在做分子动力学模拟时&#xff0c;其复杂性除了以上各种输入输出文件的操作&#xff0c;另一点就是力…

DataX数据采集流程(项目)

目录 1.CDH介绍 2.ClouderaManager架构 3.服务器 4.dataX架构 5.Datax数据处理流程 6.DataX的使用说明 7.Mysql数据切割 8.Mysql数据导入HDFS 9.查询站点 站点页面如下&#xff0c;可进一步查询导入的数据内容 10.dataX-Web访问页面 创建数据库连接 1.CDH介绍 --(…

pycharm中执行./activate命令激活服务器提示“about_Execution_Policies”

1.虚拟环境创建 环境&#xff1a; 操作系统&#xff1a;Windows11 pycharm&#xff1a; 2022.1.4 python版本&#xff1a;3.9 执行命令安装&#xff1a; pip install virtualenv 执行命令创建虚拟环境&#xff1a; virtualenv venv 2.激活报错 执行命令激活虚拟环境&…

朋友们,帮忙填写一个问卷呀!关于高速服务区一体化车流管理系统的线上调研,急需各位大神的帮助!!!

✌ 作者简介&#xff1a;瑞骏 RUIJUN &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f4ac; 人生格言&#xff1a;没有我不会的语言&#xff0c;没有你过不去的坎儿。&#x1f4ac; &#x…

Kafka Exactly Once 语义实现原理:幂等性与事务消息

01 前言 在现代分布式系统中&#xff0c;确保数据处理的准确性和一致性是至关重要的。Apache Kafka&#xff0c;作为一个广泛使用的流处理平台&#xff0c;提供了强大的消息队列和流处理功能。随着业务需求的增长&#xff0c;Kafka 的事务消息功能应运而生&#xff0c;它允许应…

cocos-lua资源管理

本文介绍cocos-lua项目的资源管理和工作流&#xff0c;适用人群包括初学者和有经验开发者&#xff0c;故读者可根据自己的需要有选择性的查阅自己需要的内容&#xff0c;下文以ccs代指Cocos Studio 一.简单案例解析 下文通过介绍一个简单demo&#xff0c;介绍合图和资源目录结…