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

 

目录

关于属性统一设置

准备数据源

范例运行环境

AttributeInducingFieldName 方法

设计与实现

如何根据 ID 查找控件

FindControlEx 方法

调用示例 

小结


关于属性统一设置

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

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

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

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

准备数据源

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

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

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

<div ><asp:Label id="l_xgzdw"  runat="server"></asp:Label><asp:TextBox id="x_xgzdw" checkSchema="maxlen50"   runat="server"  /><asp:Label id="l_cjgzsj" runat="server"></asp:Label><asp:TextBox id="x_cjgzsj" checkSchema="maxlen50" runat="server"  />
</div>

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

insert into cfg_ypz (fname,cname) values('xgzdw','现工作单位')
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 方法实现代码如下:

ArrayList paras=new ArrayList();
string refSql="";
System.Data.CommandType ct=System.Data.CommandType.Text;public void AttributeInducingFieldName(bool HasTitle,ArrayList cfg)
{object[,] ReaderData = GetReaderData("SqlServer","您的连接串",refSql,paras,HasTitle,ct);if (ReaderData == null) return;if (ReaderData.GetLength(1) < 2) return;for (int i = (HasTitle == true ? 1 : 0); i < ReaderData.GetLength(0); i++){string _fieldname = ReaderData[i,0].ToString();string _cname = ReaderData[i, 1].ToString();for (int j = 0; j < cfg.Count; j++){string[] _cfg=(string[])cfg[j];string exName = _cfg[0];string attribute = _cfg[1];string autoReqChar = "";string relaExName = "";if (_cfg.GetLength(0) > 3){relaExName = _cfg[2];autoReqChar = _cfg[3];}Control ctl = FindControlEx(exName+_fieldname);if (ctl != null){if (attribute == ""){if (relaExName != ""){Control ctl2 = FindControlEx(relaExName + _fieldname);if (ctl2 is WebControl){string _checkSchema = ((WebControl)ctl2).Attributes["checkSchema"];if (_checkSchema != null){if (_checkSchema.IndexOf("notnull") != -1){_cname = autoReqChar + _cname;}}}}SetBaseClassText(exName + _fieldname, _cname);}else{if (attribute.ToLower() != "style"){if (((WebControl)ctl).Attributes[attribute] == null){((WebControl)ctl).Attributes[attribute] = _cname;}}else{string[] styles = _cname.Split(';');for (int s = 0; s < styles.Length; s++){string[] style = styles[s].Split(':');if (style.Length > 1){string _key = style[0];string _value = style[1];((WebControl)ctl).Style[_key] = _value;if (_key.ToLower().Trim() == "visible" && _value.ToLower().Trim() == "false"){((WebControl)ctl).Visible = false;}}}}//style}}}}//for rows
}//control inducing fieldnamepublic void SetBaseClassText(string webctl,string values)
{System.Web.UI.Control btnctl;btnctl=FindControlEx(webctl);if(btnctl==null){return;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.TextBox)){((System.Web.UI.WebControls.TextBox)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Label)){((System.Web.UI.WebControls.Label)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.Button)){((System.Web.UI.WebControls.Button)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.LinkButton)){((System.Web.UI.WebControls.LinkButton)btnctl).Text=values;}if(btnctl.GetType()==typeof(System.Web.UI.WebControls.HyperLink)){((System.Web.UI.WebControls.HyperLink)btnctl).Text=values;}
}

如何根据 ID 查找控件

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

FindControlEx 方法

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

public Control  FindControlEx(Control FindPage,string ID)
{Control ctl=FindPage.FindControl(ID);if (ctl == null && FindPage.Page.Master != null){ctl=FindPage.Page.Master.FindControl(ID);}return ctl ;
}

调用示例 

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

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

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

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

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

  

小结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高编:线程(2)——同步与互斥

一、互斥 概念&#xff1a; 互斥 》在多线程中对 临界资源 的 排他性访问。 互斥机制 》互斥锁 》保证临界资源的访问控制。 pthread_mutex_t mutex; 互斥锁类型 互斥锁变量 内核对象 框架&#xff1a; 定义互斥锁 》初始化锁 》加锁 》解锁 》销…

STL的六大组件

一.总体概念 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是C标准库的一部分&#xff0c;提供了丰富且高效的数据结构和算法。STL主要由六大组件组成&#xff0c;它们是&#xff1a; 容器&#xff08;Containers&#xff09;&#xff1a;STL提…

1.(vue3.x+vite)实现卷帘效果

前端技术社区总目录(订阅之前请先查看该博客) 1:效果预览 2:代码编写 <template><div style="width

如何使用Maxscript访问C#类库?

本教程帮助你一步一步集成maxscript文档和C#类库&#xff0c;以便你能够在maxscript提供的相当有限的环境中访问dotnet框架的强大功能。这让你可以使用maxscript做一些功能更强大的事情&#xff0c;比如访问数据库、获取web部署的内容等等。 还是直接上教程实惠&#xff1a; …

昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨

目录 Python 库及 MindSpore 相关模块和类的导入 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 Python 库及 MindSpore 相关模块和类的导入 Python 中的 numpy 库被成功导入&#xff0c;并简称为 np。numpy 在科学计算领域应用广泛&#x…

SQLyog脚本无限试用重置脚本

文章目录 引言脚本(win)必要操作、说明 引言 SQLyog 需要po jie&#xff0c;但是网上的没看到很好使的&#xff0c;直接下的官方。能处理14天试用也是很ok的。 脚本(win) echo offREM SQLyog注册表key&#xff0c;可能跟你的不一样&#xff0c;如果不一样&#xff0c;请替换…

ai绘画一条作品变现1400+,怎么做一个赚钱的AI绘画账号?

大家都知道现在AI很火&#xff0c;变现的玩法也多种多样&#xff0c;但一说到AI&#xff0c;大家就下意识认为这东西离我太远&#xff0c;自己没有那么高学历&#xff0c;不会英文&#xff0c;不会用AI模型等。 其实Ai没有大家想象得那么难&#xff0c;尤其在AI绘画这块&#…

DNS访问百度

DNS&#xff0c;英文全称是 domain name system&#xff0c;域名解析系统&#xff0c;它的作用也很明确&#xff0c;就是域名和 IP 相互映射。 假设你要查询 baidu.com 的 IP 地址: 首先会查找浏览器的缓存,看看是否能找到 baidu.com 对应的IP地址&#xff0c;找到就直接返回&…

【第七节】C/C++排序算法

目录 前言 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 七、 堆排序 八、计数排序 九、桶排序 十、基数排序 前言 排序算法可以大致分为两大类&#xff1a;比较类排序和非比较类排序。以下是这两大类中一些常见的排序算法示例&…

ChatGPT-4o医学应用、论文撰写、数据分析与可视化、机器学习建模、病例自动化处理、病情分析与诊断支持

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

WPF布局控件

目录 Grid StackPanel WrapPanel DockPanel UniformGrid Canvas&InkCanvas Canvas InkCanvas Border Grid 属性 ShowGridLines&#xff1a;显示边线 ColumnDefinitions 列集合 表示有几列下面就写几个ColumnDefinition Width 宽&#xff1a;如果写具体数字则表…

科普文:一文搞懂jvm实战(一)Runtime实时监控jvm

概叙 Java Runtime 类是 Java 标准库中的关键类之一。它提供了对当前Java虚拟机&#xff08;JVM&#xff09;实例的访问和控制&#xff0c;允许程序动态地修改和管理运行时环境。 Java Runtime 是Java虚拟机&#xff08;JVM&#xff09;的一个实例&#xff0c;代表了正在执行Ja…

Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

python中的包和模块

目录 一、包与模块 二、第三方包的安装 2.1 pip install 2.2使用 curl 管道 2.3其他安装方法 三、导入单元的构成 3.1pip的使用 四、模块的缓存 一、包与模块 Python 中除了函数库以外&#xff0c;还有非常多且优秀的第三方库、包、模块。 模块Module&#xff1a;以…

【linux网络(七)】数据链路层详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 认识MAC…

【计算机毕业设计】061互助学习微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

北京网站建设怎么开始做

北京作为中国的首都&#xff0c;拥有众多的企业和机构&#xff0c;网站建设不仅是一种宣传和推广的手段&#xff0c;更是企业发展的必备工具。但是对于很多企业来说&#xff0c;网站建设是一个相对陌生的领域&#xff0c;不知道从哪里开始。今天我们就来谈一谈北京网站建设的步…

Dockerhub无法拉取镜像配置阿里镜像加速器

打开阿里镜像加速地址&#xff1a; https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 根据平台类型按照对应方式进行配置&#xff1a;Dokcer Desktop是在右上角点开配置 找到Docker Engine 进行设置JSON结构&#xff1a; 记得要重启Docker服务才会生效&#xff01…

深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 预测系统的分类指标(精确率、召回率和 F1 值) 简介 让我们来谈谈预测系统的分类指标以及对精确率、召回…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…