当前位置:   article > 正文

C# Web控件与数据感应之属性统一设置

C# Web控件与数据感应之属性统一设置

 

目录

关于属性统一设置

准备数据源

范例运行环境

AttributeInducingFieldName 方法

设计与实现

如何根据 ID 查找控件

FindControlEx 方法

调用示例 

小结


关于属性统一设置

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,属性统一设置 ,是指业务规则,通过配置数据,统一对数据控件的属性进行赋值,以达到灵活应用的目的。比如是否为必填写项的设置,以便于统一操作。

如图其中放置了一些标签(Label)控件、(TextBox)文本框控件、(DropDownList)下拉列表框,用于录入及选择一些值,比如现工作单位、参加工作时间、职称、职务等信息。

实际业务中,如不同的用户类型,相同的注册界面,则可考虑某些输入项的必填写属性的变化,如没有工作单位的则无须填写现工作单位和参加工作时间,反之在职人员则必须填写(图中标签带有*号的均为必填写项的提示性标志)。根据统一属性设置,可以显示如下图:

图中的现工作单位和参加工作时间前面的*号不存了,则表示为不必填写项,以避免输入“无” 字来“绕” 过检查。 

准备数据源

我们在 MS SQL Server 创建表 cfg_ypz(配置数据视图),其结构如下表:

序号字段名类型说明
1fnamenvarchar控件主名(如字段名)
2cnamenvarchar属性值

我们假设界面有如下控件,代码如下:

  1. <div >
  2. <asp:Label id="l_xgzdw" runat="server"></asp:Label>
  3. <asp:TextBox id="x_xgzdw" checkSchema="maxlen50" runat="server" />
  4. <asp:Label id="l_cjgzsj" runat="server"></asp:Label>
  5. <asp:TextBox id="x_cjgzsj" checkSchema="maxlen50" runat="server" />
  6. </div>

其中,xgzdw (现工作单位)和 cjgzsj (参加工作时间)即为控件主名,而 l_ 前缀为标签提示控件,x_ 前缀为输入控件,那么我们可以初始化配置数据, SQL语句如下:

  1. insert into cfg_ypz (fname,cname) values('xgzdw','现工作单位')
  2. insert into cfg_ypz (fname,cname) values('cjgzsj','参加工作时间')

最后我们将数据填充到 DataReader ,并生成对应的二维数组。

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

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

开发工具:VS2019  C#

AttributeInducingFieldName 方法

设计与实现

AttributeInducingFieldName 方法主要是通过 object[,] 二维对象数组数据源进行提取并根据主控件名与控件ID进行匹配,查找匹配成功则根据配置参数的进行统一属性赋值,其参数设置见下表:

序号参数名类型说明
1HasTitlebool数据集是否包含列名,如果包含则数据输出从第2行开始
2cfgArrayList

必须值,一个配置参数列表,每一个项为一个一维字符串数组,最多有个4个值,项目的数目为必须有2个值或者4个值。

(1)2个值的情况,指要赋值控件的前缀,后面为属性名称,如 new string[] { "x_", "onclick" } 表示为按主控件名+x_前缀名进行查找,并赋予 onclick 属性(值 根据数据配置表进行设置)

(2)4个值的情况,如 new string[]{ "l_", "","x_","*" } ,前2个值可以设置为空略过,后两个值为必填写项的设置,第4个值为必填写项的提示字符前缀,如“*”号 

方法中会用到 GetReaderData 方法可以访问数据库数据表进行查询结果的提取,并转化为 object[,] 二维数组,具体实现请参考我的文章:《C# Web控件与数据感应之 填充 HtmlTable》中的GetReaderData 方法实现代码。

AttributeInducingFieldName 方法实现代码如下:

  1. ArrayList paras=new ArrayList();
  2. string refSql="";
  3. System.Data.CommandType ct=System.Data.CommandType.Text;
  4. public void AttributeInducingFieldName(bool HasTitle,ArrayList cfg)
  5. {
  6. object[,] ReaderData = GetReaderData("SqlServer","您的连接串",refSql,paras,HasTitle,ct);
  7. if (ReaderData == null) return;
  8. if (ReaderData.GetLength(1) < 2) return;
  9. for (int i = (HasTitle == true ? 1 : 0); i < ReaderData.GetLength(0); i++)
  10. {
  11. string _fieldname = ReaderData[i,0].ToString();
  12. string _cname = ReaderData[i, 1].ToString();
  13. for (int j = 0; j < cfg.Count; j++)
  14. {
  15. string[] _cfg=(string[])cfg[j];
  16. string exName = _cfg[0];
  17. string attribute = _cfg[1];
  18. string autoReqChar = "";
  19. string relaExName = "";
  20. if (_cfg.GetLength(0) > 3)
  21. {
  22. relaExName = _cfg[2];
  23. autoReqChar = _cfg[3];
  24. }
  25. Control ctl = FindControlEx(exName+_fieldname);
  26. if (ctl != null)
  27. {
  28. if (attribute == "")
  29. {
  30. if (relaExName != "")
  31. {
  32. Control ctl2 = FindControlEx(relaExName + _fieldname);
  33. if (ctl2 is WebControl)
  34. {
  35. string _checkSchema = ((WebControl)ctl2).Attributes["checkSchema"];
  36. if (_checkSchema != null)
  37. {
  38. if (_checkSchema.IndexOf("notnull") != -1)
  39. {
  40. _cname = autoReqChar + _cname;
  41. }
  42. }
  43. }
  44. }
  45. SetBaseClassText(exName + _fieldname, _cname);
  46. }
  47. else
  48. {
  49. if (attribute.ToLower() != "style")
  50. {
  51. if (((WebControl)ctl).Attributes[attribute] == null)
  52. {
  53. ((WebControl)ctl).Attributes[attribute] = _cname;
  54. }
  55. }
  56. else
  57. {
  58. string[] styles = _cname.Split(';');
  59. for (int s = 0; s < styles.Length; s++)
  60. {
  61. string[] style = styles[s].Split(':');
  62. if (style.Length > 1)
  63. {
  64. string _key = style[0];
  65. string _value = style[1];
  66. ((WebControl)ctl).Style[_key] = _value;
  67. if (_key.ToLower().Trim() == "visible" && _value.ToLower().Trim() == "false")
  68. {
  69. ((WebControl)ctl).Visible = false;
  70. }
  71. }
  72. }
  73. }//style
  74. }
  75. }
  76. }
  77. }//for rows
  78. }//control inducing fieldname
  79. public void SetBaseClassText(string webctl,string values)
  80. {
  81. System.Web.UI.Control btnctl;
  82. btnctl=FindControlEx(webctl);
  83. if(btnctl==null)
  84. {
  85. return;
  86. }
  87. if(btnctl.GetType()==typeof(System.Web.UI.WebControls.TextBox))
  88. {
  89. ((System.Web.UI.WebControls.TextBox)btnctl).Text=values;
  90. }
  91. if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Label))
  92. {
  93. ((System.Web.UI.WebControls.Label)btnctl).Text=values;
  94. }
  95. if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Button))
  96. {
  97. ((System.Web.UI.WebControls.Button)btnctl).Text=values;
  98. }
  99. if(btnctl.GetType()==typeof(System.Web.UI.WebControls.LinkButton))
  100. {
  101. ((System.Web.UI.WebControls.LinkButton)btnctl).Text=values;
  102. }
  103. if(btnctl.GetType()==typeof(System.Web.UI.WebControls.HyperLink))
  104. {
  105. ((System.Web.UI.WebControls.HyperLink)btnctl).Text=values;
  106. }
  107. }

如何根据 ID 查找控件

FindControlEx 实现了对 FindControl 方法的扩充,如果查找不成功可试图查找是否有母版页,如果存在,则根据母版页模式继续查找。

FindControlEx 方法

FindControlEx 通过传递要查找的服务器容器控件和ID参数,以返回查找到的控件,代码如下:

  1. public Control FindControlEx(Control FindPage,string ID)
  2. {
  3. Control ctl=FindPage.FindControl(ID);
  4. if (ctl == null && FindPage.Page.Master != null)
  5. {
  6. ctl=FindPage.Page.Master.FindControl(ID);
  7. }
  8. return ctl ;
  9. }

调用示例 

前端代码请参照准备数据源小节示例:

示例(1)将查询出来的配置数据指定的控件设置为必填写项,并为其自定义属性(cName)进行赋值,代码如下:

  1. string refSql="select fname,cname from cfg_ypz";
  2. System.Data.CommandType ct=System.Data.CommandType.Text;
  3. ArrayList cfg = new ArrayList();
  4. cfg.Add(new string[]{ "l_", "","x_","*" });
  5. cfg.Add(new string[] { "x_", "cName" });
  6. AttributeInducingFieldName(true,cfg);

示例(2)将查询出来的配置数据指定的控件为其 onclick 属性进行赋值,代码如下:

  1. string refSql="select fname,'onclick_funtion()' as cname from cfg_ypz";
  2. System.Data.CommandType ct=System.Data.CommandType.Text;
  3. ArrayList cfg = new ArrayList();
  4. cfg.Add(new string[] { "x_", "onclick" });
  5. AttributeInducingFieldName(true,cfg);

  

小结

配置数据的 cname 属性值,如果值中有 "visible:false" 键值,则可以对控件进行 Visible 的进行 False 设置,这是根据项目实际的一些需要进行的功能实现。以上就是关于控件属性统一设置的介绍,我们可以根据自己的实际需要进行改造和功能扩充,本示例代码仅供您参考。 

感谢您的阅读,希望本文能够对您有所帮助。

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

闽ICP备14008679号