当前位置:   article > 正文

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

c# 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 的解析判断如下表:

序号控件类型有效赋值属性取值说明
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 方法完整代码如下:

  1. 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)
  2. {
  3. string rv="";
  4. string strConn =ConfigurationSettings.AppSettings[ConnKeyString];
  5. if(ConnString!="")
  6. {
  7. strConn=ConnString;
  8. }
  9. System.Data.IDbConnection Conn=GetConnection(DbServerType,strConn);
  10. System.Data.IDbCommand Cmd=GetCommand(DbServerType,sql,paras,Conn);
  11. System.Data.IDataReader myDr=GetDataReader(DbServerType);
  12. try
  13. {
  14. Conn.Open();
  15. if (DbServerType.ToLower() == "dm8")
  16. {
  17. myDr = Cmd.ExecuteReader() as DmDataReader;
  18. }
  19. else
  20. {
  21. myDr = Cmd.ExecuteReader();
  22. }
  23. if (_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlGenericControl))
  24. {
  25. if(myDr.Read())
  26. ((System.Web.UI.HtmlControls.HtmlGenericControl)_object).InnerText=myDr[keyfield].ToString();
  27. }
  28. if(_object.GetType()==typeof(System.Web.UI.WebControls.Label))
  29. {
  30. if(myDr.Read())
  31. ((System.Web.UI.WebControls.Label)_object).Text=myDr[keyfield].ToString();
  32. }
  33. if(_object.GetType()==typeof(System.Web.UI.WebControls.TextBox))
  34. {
  35. if(myDr.Read())
  36. ((System.Web.UI.WebControls.TextBox)_object).Text=myDr[keyfield].ToString();
  37. }
  38. if(_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlInputText))
  39. {
  40. if(myDr.Read())
  41. ((System.Web.UI.HtmlControls.HtmlInputText)_object).Value=myDr[keyfield].ToString();
  42. }
  43. if(_object.GetType()==typeof(System.Web.UI.WebControls.DropDownList))
  44. {
  45. ((System.Web.UI.WebControls.DropDownList)_object).DataSource = myDr;
  46. ((System.Web.UI.WebControls.DropDownList)_object).DataTextField = displayfield;
  47. ((System.Web.UI.WebControls.DropDownList)_object).DataValueField = keyfield;
  48. }
  49. if(_object.GetType()==typeof(System.Web.UI.WebControls.ListBox))
  50. {
  51. ((System.Web.UI.WebControls.ListBox)_object).DataSource = myDr;
  52. ((System.Web.UI.WebControls.ListBox)_object).DataTextField = displayfield;
  53. ((System.Web.UI.WebControls.ListBox)_object).DataValueField = keyfield;
  54. }
  55. if(_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlSelect))
  56. {
  57. ((System.Web.UI.HtmlControls.HtmlSelect)_object).DataSource = myDr;
  58. ((System.Web.UI.HtmlControls.HtmlSelect)_object).DataTextField = displayfield;
  59. ((System.Web.UI.HtmlControls.HtmlSelect)_object).DataValueField = keyfield;
  60. }
  61. _object.DataBind();
  62. myDr.Close();
  63. }
  64. catch (Exception e)
  65. {
  66. rv=e.Message;
  67. }
  68. finally
  69. {
  70. Conn.Close();
  71. Conn.Dispose();
  72. }
  73. if(allownull)
  74. {
  75. if(_object.GetType()==typeof(System.Web.UI.WebControls.DropDownList))
  76. {
  77. ((System.Web.UI.WebControls.DropDownList)_object).Items.Insert (0,new ListItem(allownulltext,allownullvalue));
  78. ((System.Web.UI.WebControls.DropDownList)_object).SelectedIndex=((System.Web.UI.WebControls.DropDownList)_object).Items.IndexOf(((System.Web.UI.WebControls.DropDownList)_object).Items.FindByValue(defaultvalue));
  79. }
  80. if(_object.GetType()==typeof(System.Web.UI.WebControls.ListBox))
  81. {
  82. ((System.Web.UI.WebControls.ListBox)_object).Items.Insert (0,new ListItem(allownulltext,allownullvalue));
  83. ((System.Web.UI.WebControls.ListBox)_object).SelectedIndex=((System.Web.UI.WebControls.ListBox)_object).Items.IndexOf(((System.Web.UI.WebControls.ListBox)_object).Items.FindByValue(defaultvalue));
  84. }
  85. if(_object.GetType()==typeof(System.Web.UI.HtmlControls.HtmlSelect))
  86. {
  87. ((System.Web.UI.HtmlControls.HtmlSelect)_object).Items.Insert (0,new ListItem(allownulltext,allownullvalue));
  88. ((System.Web.UI.HtmlControls.HtmlSelect)_object).SelectedIndex=((System.Web.UI.HtmlControls.HtmlSelect)_object).Items.IndexOf(((System.Web.UI.HtmlControls.HtmlSelect)_object).Items.FindByValue(defaultvalue));
  89. }
  90. }
  91. return rv;
  92. }//simpleDataListEx
  93. public System.Data.IDbConnection GetConnection(string DbServerType,string ConnectionString)
  94. {
  95. IDbConnection con = null;
  96. switch (DbServerType.ToLower())
  97. {
  98. case "oracle":
  99. con = new OracleConnection(ConnectionString);break;
  100. case "dm8":
  101. con = new DmConnection(ConnectionString); break;
  102. default:
  103. con = new SqlConnection(ConnectionString); break;
  104. }
  105. return con;
  106. }
  107. public IDbCommand GetCommand(string dbservertype,string cmdText,ArrayList paras,IDbConnection con)
  108. {
  109. IDbCommand cmd = null;
  110. switch (dbservertype.ToLower())
  111. {
  112. case "oracle": cmd = new OracleCommand(cmdText,(OracleConnection)con);
  113. break;
  114. case "dm8":
  115. cmd = new DmCommand(cmdText, (DmConnection)con);
  116. break;
  117. default: cmd = new SqlCommand(cmdText,(SqlConnection)con); break;
  118. }
  119. if(paras!=null)
  120. {
  121. for(int i=0;i<paras.Count;i++)
  122. {
  123. cmd.Parameters.Add(GetParameter(dbservertype,paras[i]));
  124. }
  125. }
  126. return cmd;
  127. }
  128. public System.Data.IDbDataParameter GetParameter(string dbservertype,object paras)
  129. {
  130. IDbDataParameter para = null;
  131. switch (dbservertype.ToLower())
  132. {
  133. case "oracle": para =(OracleParameter)paras;
  134. break;
  135. case "dm8":
  136. para = (DmParameter)paras;
  137. break;
  138. default: para =(SqlParameter)paras; break;
  139. }
  140. return para;
  141. }

调用示例

数据源

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

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

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

调用

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

  1. ArrayList paras = new ArrayList();
  2. string xm_cid="E5FB9BF5-6CB6-4792-B105-C4453028925D"; //项目ID
  3. paras.Add(new SqlParameter("@cid", xm_cid));
  4. simpleDataListEx("sqlserver","数据库连接串","select value,text from pub_type where xm_cid=@cid order by sortid", paras, "text", "value", TB, true, "", "","");
  5. 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 类类型控件,我们可以根据自己的实际需要扩充范围类型的控件和改造符合自己要求的功能,感谢您的阅读,希望本文能够对您有所帮助。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/890734
推荐阅读
  

闽ICP备14008679号