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

目录

关于数据感应

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 类类型控件,我们可以根据自己的实际需要扩充范围类型的控件和改造符合自己要求的功能,感谢您的阅读,希望本文能够对您有所帮助。

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

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

相关文章

pytest教程-35-钩子函数-pytest_unconfigure

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_configure钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_unconfigure钩子函数的使用方法。 pytest_unconfigure(config) 是一个 pytest 钩子函数&#xff0c;它在 pytest 退…

【linux运维】vim基础应用

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了学习基本的shell编程和linux命令&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于b站大学——linux运维课程进行的&#xff0c;…

【MHA】MySQL高可用MHA源码1-主库故障监控

1 阅读之前的准备工作 1 一个IDE工具 &#xff0c;博主自己尝试了vscode安装perl的插件&#xff0c;但是函数 、变量 、模块等都不能跳转&#xff0c;阅读起来不是很方便。后来尝试使用了pycharm安装perl插件&#xff0c;阅读支持跳转&#xff0c;自己也能写一些简单的测试样例…

[iOS]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中&#xff0c;一个组件是指一个独立的、可替换的软件单元&#xff0c;它封装了一组相关的功能。组件通过定义的接口与外界交互&#xff0c;并且这些接口隔离了组件内部的实现细节。在Swift语言中&#xff0c;组件可以是一个模块、一…

CCF-CSP真题题解:201312-2 ISBN号码

201312-2 ISBN号码 #include <iostream> #include <cstring> #include <algorithm> using namespace std;string s;int main() {cin >> s;int num 0;for (int i 0, p 1; i < s.size() - 1; i)if (s[i] ! -) {num (s[i] - 0) * p;p;}num % 11;ch…

win11 自带分区磁盘管理,右键U盘 删除卷,显示不支持该请求

win11 自带分区磁盘管理&#xff0c;右键U盘 删除卷&#xff0c;显示不支持该请求&#xff0c;打开cmd 输入下面命令 1.diskpart 2.list disk 3.sel disk (U盘盘符编号) 4.clean

Linux vi\vim编辑器

vi/vim编辑器 一、vi\vim 编辑器的三种工作模式1.命令模式&#xff08;Command mode&#xff09;2.输入模式&#xff08;Insert mode&#xff09;3.底线命令模式&#xff08;Last line mode&#xff09; 二、参考 vi\vim 是 visual interface 的简称&#xff0c;是 Linux 中最经…

Tcp 协议的接口测试

首先明确 Tcp 的概念&#xff0c;针对 Tcp 协议进行接口测试&#xff0c;是指基于 Tcp 协议的上层协议比如 Http &#xff0c;串口&#xff0c;网口&#xff0c; Socket 等。这些协议与 Http 测试方法类似&#xff08;具体查看接口自动化测试章节&#xff09;&#xff0c;但在测…

大数据计算引擎中的Calcite

1.Calcite介绍 Calcite是一个动态数据库管理框架&#xff0c;具备数据库管理系统的功能 Calcite具备SQL解析、校验、优化、生成、连接查询等功能 Calcite能够为不同平台和数据源提供统一的查询引擎 2.Calcite能力 比如&#xff0c;对于HBase而言&#xff0c;没有SQL查询的能力…

Qt 6 开源版(免费) -- 安装图解

Qt6起&#xff0c;两项重大改变&#xff08;并非指技术&#xff09;&#xff1a; 必须在线安装&#xff0c;不再提供单独的安装包主推收费的商业版 当然的&#xff0c;为了引流、培养市场&#xff0c;提供了一个免费的开源版本。 开源版相对于收费的商业版&#xff0c;主体是…

PostgreSQL 14 向量相似度搜索插件 (pgvector) 安装指南

本文是关于在 PostgreSQL 14 中安装并使用向量相似度搜索插件(pgvector)的详细指南。此插件允许用户在数据库中执行高效的向量运算,特别适用于机器学习模型的向量数据存储与检索场景。 环境需求 已安装PostgreSQL 14或更高版本。安装了Visual Studio 2022,用于编译插件。安装…

微信小程序+esp8266温湿度读取

本文主要使用微信小程序显示ESP8266读取的温湿度并通过微信小程序控制LED灯。小程序界面如下图所示 原理讲解 esp8266 通过mqtt发布消息,微信小程序通过mqtt 订阅消息,小程序订阅后,就可以实时收到esp8266 传输来的消息。 个人可免费注册五个微信小程序账号,在微信小程序官…

渗透之sql注入---实战1

本期的sql注入实战在&#xff1a;BUUCTF在线评测 (buuoj.cn) 该网站上进行。 启动靶机&#xff1a; 1.进来后搜索web1 2.点击【SWPU2019】Web1启动靶机。 3.进来之后在此界面进行注入。 开始注入&#xff1a; 1.找注入点&#xff1a; 我们输入1 后查看广告详情发现报错&a…

利用kimi等大模型进行运维参数解析和调优

在运维时&#xff0c;经常遇到很多参数&#xff0c;有些参数不知道意义&#xff0c;知道意义的也有些不知道合理参考值是多少。利用kimi等大模型来当老司机&#xff0c;轻松解决运维难题。 例如在运维hive参数时&#xff0c;有些不知道作用&#xff0c;提示次如下 你的角色是…

vue根据输入n动态生成n个表单

我的构想&#xff1a;在输入框中输入一个数字n&#xff0c;然后点击一个按钮&#xff0c;弹出一个弹窗&#xff0c;里面有n个表单。 这是按钮的vue代码&#xff1a;数值保存在form.number里面&#xff0c;每次数字改变会触发numberChange //...略 <el-form-item prop"…

POCEXP编写—多线程

POC&EXP编写—多线程 1. 前言2. 多进程&多线程2.1. 多进程2.1.1. 案例 2.2. 多线程2.2.1. 案例&#xff1a; 2.3. POC的案例&#xff08;模板&#xff09; 3. UA头设置3.1. 随机UA头3.1.1. 案例3.1.2. 模板拼接 4. 代理Proxy4.1. 单代理案例4.2. 多代理案例4.2.1. 请求…

【2024最叼教程】Appium自动化环境搭建保姆级教程

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

鸿蒙内核源码分析(线程概念篇) | 是谁在不断的折腾CPU

本篇说清楚任务的问题 在鸿蒙内核线程(thread)就是任务(task)&#xff0c;也可以叫作业.线程是对外的说法&#xff0c;对内就叫任务.跟王二毛一样&#xff0c; 在公司叫你王董&#xff0c;回到家里还有领导&#xff0c;就叫二毛啊.这多亲切.在鸿蒙内核是大量的task&#xff0c…

【Linux系列】 离线安装vnc 可视化桌面

离线安装vnc 可视化桌面 缘下载安装vnc初始化链接 缘 项目需要下载 下载地址&#xff1a; http://mirror.centos.org/centos/7/updates/x86_64/Packages/tigervnc-license-1.8.0-31.el7_9.noarch.rpm http://mirror.centos.org/centos/7/os/x86_64/Packages/libXfont2-2.0.…

Word插件开发

VSTO是Visual Studio Tools for Office的简称&#xff0c;它是Microsoft Visual Studio的一个扩展&#xff0c;用于开发基于Microsoft Office平台的应用程序。VSTO提供了一套API和工具&#xff0c;使开发人员能够利用Visual Studio IDE来开发定制的Office解决方案。 在 Visual…