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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: C# Web控件与数据感应之 Control 类

关于数据感应

数据感应也即数据捆绑,是一种动态的,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 类控件上,其参数说明如下表:

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

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

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

5 keyfield string

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

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

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

序号 控件类型 有效赋值属性 取值说明
1

System.Web.UI.HtmlControls.

HtmlGenericControl

InnerText 取keyfield字段值
2

System.Web.UI.WebControls.

Label

Text 取keyfield字段值
3

System.Web.UI.

WebControls.TextBox

Text 取keyfield字段值
4

System.Web.UI.

HtmlControls.HtmlInputText

Value 取keyfield字段值
5

System.Web.UI.WebControls.

DropDownList

DataTextField

DataValueField

DataTextField取displayfield字段值

DataValueField取keyfield字段值

6

System.Web.UI.WebControls.

ListBox

DataTextField

DataValueField

DataTextField取displayfield字段值

DataValueField取keyfield字段值

7

System.Web.UI.HtmlControls.

HtmlSelect

DataTextField

DataValueField

DataTextField取displayfield字段值

DataValueField取keyfield字段值

实现

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)设计基本情况如下表:

序号 字段名 类型 说明 备注
1 xm_cid uniqueidentifier 项目ID
2 value nvarchar(100) 存储的值
3 text nvarchar(100) 存储的显示值 用户可以看到的选择时的呈现值
4 sortid int 排序号

调用

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

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
4天前
|
JSON Android开发 数据格式
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
21 2
|
2天前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
9 1
|
4天前
|
XML 开发框架 .NET
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作
15 1
|
4天前
|
C#
c# 所有类的最终基类:Object
c# 所有类的最终基类:Object
7 0
|
4天前
|
安全 C#
C#Webrequest类的使用
C#Webrequest类的使用
10 0
|
4天前
|
SQL 存储 C#
C# Web控件与数据感应之 TreeView 类
C# Web控件与数据感应之 TreeView 类
|
4天前
|
SQL 存储 Oracle
C# Web控件与数据感应之 CheckBoxList 类
C# Web控件与数据感应之 CheckBoxList 类
|
4天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
4天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
4天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。