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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: 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 类类型控件,我们可以根据自己的实际需要扩充范围类型的控件和改造符合自己要求的功能,感谢您的阅读,希望本文能够对您有所帮助。

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
1月前
|
SQL 开发框架 .NET
C#一分钟浅谈:数据绑定与数据源控件
在Web开发中,数据绑定和数据源控件是实现动态网页的关键技术。本文从基础概念入手,详细讲解数据绑定的原理及其在ASP.NET中的应用,并介绍常见数据绑定方式:手动绑定和自动绑定。接着,文章重点介绍了ASP.NET中的数据源控件,如`SqlDataSource`、`ObjectDataSource`、`XmlDataSource`和`LinqDataSource`,并通过具体示例演示如何使用`SqlDataSource`和`GridView`进行数据绑定。最后,还列举了一些常见问题及其解决办法,帮助读者更好地理解和应用这些技术。
61 4
|
1月前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
72 0
|
2月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
79 2
|
20天前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
2月前
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
30天前
|
存储 前端开发 API
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
90 0
|
1月前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
44 0
|
2月前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
79 1
|
1月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
12 0