C# Web控件与数据感应之数据返写

目录

关于数据返写

准备视图

范例运行环境

ControlInducingFieldName 方法

设计与实现

如何根据 ID 查找控件

FindControlEx 方法

调用示例 

小结


关于数据返写

数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,数据返写 ,是指将查询出来的数据,通过可显示数据的UI控件进行数据输出,如查询详情页,见下图:

如图其中放置了一些标签(Label)控件用于查询输出,比如单位名称、项目名称、被测评人、总得分、手机号或账户等信息。

本文将介绍如何中通过 C# 实现查询并返写数据到服务器UI控件上。

准备视图

我们在 MS SQL Server 创建视图 v_es_project_persons(考试人员详情视图),其结构如下表:

序号字段名类型说明
1ciduniqueidentifier项目唯一标识
2wxmpciduniqueidentifier人员唯一标识
3ProjectNamenvarchar项目名称
4pubstatenvarchar项目发布状态
5personsint项目允许考试人数上限
6namenvarchar姓名
7mobilenvarchar手机
8scorenumeric考试成绩

执行定位项目及人员的查询SQL语句,如下:

select wxmpcid,ProjectName,pubstate,persons,name,mobile,score 
from v_es_project_persons 
where cid='960105b0-42b6-413a-a87a-f5fa338b2f2c' and wxmpcid='21f4c424-a1df-4161-be1b-ce441e058be6'

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

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

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

开发工具:VS2019  C#

ControlInducingFieldName 方法

设计与实现

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

序号参数名类型说明
1HasTitlebool数据集是否包含列名,如果包含则数据输出从第2行开始
2VerticalQueryModebool垂直字典查询模式,数据集第1列为要查找的ID值,第2列为要输出的值

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

ControlInducingFieldName 方法实现代码如下:

ArrayList paras=new ArrayList();
string refSql="";
System.Data.CommandType ct=System.Data.CommandType.Text;public void ControlInducingFieldName(bool HasTitle,bool VerticalQueryMode)
{object[,] ReaderData = GetReaderData("SqlServer","您的连接串",refSql,paras,HasTitle,ct);if (ReaderData == null) return;for (int i =(HasTitle==true?1:0); i < ReaderData.GetLength(0); i++){for (int j = (VerticalQueryMode==false?0:1); j < ReaderData.GetLength(1); j++){string _fieldname = "";Control ctl = new Control();if (VerticalQueryMode == false){_fieldname = ReaderData[0, j].ToString();ctl=FindControlEx(_fieldname + (i == 1 ? "" : i.ToString()));}else{_fieldname = ReaderData[i, 0].ToString();ctl = FindControlEx(_fieldname);}if (ctl != null ){if (ctl.GetType() == typeof(Label)){((Label)ctl).Text = ReaderData[i, j].ToString();}else if (ctl.GetType() == typeof(Literal)){((Literal)ctl).Text = ReaderData[i, j].ToString();}else if (ctl.GetType() == typeof(TextBox)){((TextBox)ctl).Text =  ReaderData[i, j].ToString();}else if (ctl.GetType() == typeof(DropDownList)){((DropDownList)ctl).SelectedValue = ReaderData[i, j].ToString();}else if (ctl.GetType() == typeof(HyperLink)){((HyperLink)ctl).NavigateUrl = ReaderData[i, j].ToString();}else if (ctl.GetType() == typeof(HtmlLink)){((HtmlLink)ctl).Href = ReaderData[i, j].ToString();}else if (ctl.GetType().ToString().IndexOf("System.Web.UI.HtmlControls") == 0){string[] styles = ReaderData[i, j].ToString().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];((HtmlControl)ctl).Style[_key] = _value;if (_key.ToLower().Trim() == "visible" && _value.ToLower().Trim() == "false"){((HtmlControl)ctl).Visible = false;}else if (_key.ToLower().Trim() == "visible" && _value.ToLower().Trim() == "true"){((HtmlControl)ctl).Visible = true;}}}}//ctl set}//if ctl not null }}
}//control inducing fieldname

如何根据 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 ;
}

调用示例 

客户端 UI 设计代码如下,控件的ID与字段名输出保持一致即可:

<h2><asp:Label ID="fnamelabel" runat="server" Text="查看个人详情"></asp:Label>
</h2><div style="display: flex;"><div class="query-box"><label>项目名称:</label><asp:Label ID="ProjectName" Text="" Font-Bold="true" runat="server" />(人数上限:<asp:LabelID="persons" Text="" runat="server" />人)</div></div><div style="display: flex;"><div class="query-box"><label>被测评人:</label><asp:Label ID="name" Text="" Font-Bold="true" runat="server" /></div><div class="query-box" style=" margin-left :10px;"><label>总得分:</label><asp:Label ID="score" Text="" Font-Bold="true" runat="server" /></div></div><div style="display: flex;"><div class="query-box"><label>手机号或账户:</label><asp:Label ID="mobile" Text="" Font-Bold="true" runat="server" /></div></div>

服务端示例代码如下(假设传递项目唯一标识和人员唯一标识参数):

ArrayList paras = new ArrayList();
string refSQL = "select wxmpcid,ProjectName,pubstate,persons,name,mobile,score 
from v_es_project_persons where cid=@cid and wxmpcid=@wxmpcid";paras.Clear();
paras.Add(new SqlParameter("cid", Request.QueryString["cid"]));
paras.Add(new SqlParameter("wxmpcid", Request.QueryString["wxmpcid"]));System.Data.CommandType ct=System.Data.CommandType.Text;ControlInducingFieldName(true,true);

  

小结

ControlInducingFieldName 方法目前可支持如下控件返写:

(1)Label 控件的 Text 属性

(2)Literal 控件的 Text 属性

(3)TextBox 控件的 Text 属性

(4)DropDownList 控件的 Text 属性

(5)HyperLink 控件的 NavigateUrl 属性

(6)HtmlLink 控件的 Href 属性

另外对于 HtmlControls ,如果值为 "visible:true" 或 "visible:false",则可以对控件进行 Visible 的设置,这是根据项目实际的一些需要进行的功能实现。以上就是关于控件数据返写的介绍,我们可以根据自己的实际需要进行改造和控件识别的扩充,本示例代码仅供您参考。 

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

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

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

相关文章

element-ui table使用type=‘selection‘复选框全禁用-全选禁用_elementui table禁用全选

问题点&#xff1a;当条件数据全被禁用时&#xff0c;全选按钮不是禁用的状态。 复选框全被禁用时&#xff0c;全选按钮将被隐藏 问题总结&#xff1a; 当条件数据全被禁用时&#xff0c;全选按钮也变成禁用的状态&#xff0c;而不是隐藏。有会做的小伙伴希望跟帖。谢谢&#x…

Redis-数据类型-zset

文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db4数据库4、将一个或多个member元素及其score值加入到有序集key当中5、升序返回有序集key6、升序返回有序集key&#xff0c;让分数一起和值返回的结果集7、降序返回有序集key&#xff0c;让分数一起和值返回到结…

同城跑腿APP开发,随叫随到超方便!

随着移动互联网的发展和人们生活节奏的加快&#xff0c;越来越多的人们没有闲暇的时间来做一些繁琐的事情&#xff0c;比如说买药、挂号、排队、送花、取文件等等。如果没有时间去处理这些事情怎么办&#xff1f;开发同城跑腿APP&#xff0c;提供跑腿服务&#xff0c;随时办事随…

【C++】循环、控制流语句、指针、引用

8、循环&#xff08;loops&#xff09;&#xff08;1&#xff09;for loops for循环非常灵活&#xff0c;可以做很多事情。上图红框框出来的代码块就是一个for循环。 for是关键字 for后面内容分为三部分&#xff0c;每部分用分号&#xff1b;隔开 第一部分A是变量的声明&…

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维&#xff0c;在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现&#xff1a;坐标校正&#xff0c;我们如何使漫无目的鼠标点击变得有序化和可控化呢&#xff1f; 目录 一、从鼠标监听到获取坐标 1.MouseListener和Mouse…

VBA学习(16):工作表事件示例:输入数据后锁定单元格

在工作表单元格中输入数据后&#xff0c;该单元格就被锁定&#xff0c;不能再编辑。 打开VBE&#xff0c;在工程资源管理器中双击该工作表名称打开其代码模块&#xff0c;在其中输入下面的代码&#xff1a; 假设整个工作表的LockedFalse Private Sub Worksheet_Change(ByVal …

用JavaScript实现了一个简单的图像坐标点标注工具

这段代码实现了一个简单的图像标注工具&#xff0c;允许用户在加载的图像上进行点选标注&#xff0c;并且通过右键确认一个点序列来形成一个多边形。 标注效果如下 实现代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

AI绘画Stable Diffusion 超强一键去除图片中的物体,免费使用!

大家好&#xff0c;我是设计师阿威 在生成图像时总有一些不完美的小瑕疵&#xff0c;比如多余的物体或碍眼的水印&#xff0c;它们破坏了图片的美感。但别担心&#xff0c;今天我们将介绍一款神奇的工具——sd-webui-cleaner&#xff0c;它可以帮助我们使用Stable Diffusion轻…

Rust高性能日志库tklog0.0.8—支持mod设置参数

tklog是rust高性能结构化日志库&#xff0c;支持同步日志&#xff0c;异步日志&#xff0c;支持自定义日志的输出格式&#xff0c;支持按时间&#xff0c;按文件大小分割日志文件&#xff0c;支持日志文件压缩备份&#xff0c;支持官方日志库标准API&#xff0c;支持mod独立参数…

怎么将文件免费扫描?这篇文章教你几个文件扫描方法

随着时间的流逝&#xff0c;我们所珍藏的纸质文件可能会面临破损和丢失的风险。 为了确保这些宝贵的资料得到妥善保管&#xff0c;将它们转换为电子格式并存储于电脑中无疑是一个明智之举。 那么&#xff0c;我们应当如何将这些纸质资料转换为易于管理和访问的电子文档呢&…

CMake基础教程

用法 cmake -B build // 配置&#xff0c;在源码目录用 -B 直接创建 build 目录并生成 build/Makefile cmake --build build -j4 // 构建&#xff0c;Linux会调用make&#xff0c;Windows会调用devenv.exe cmake --version 定义 -DCMAKE_INSTALL_PREFIX/opt/openvdb-8.0 /…

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 泛型编程 首先让我们来思考一个问题&#xff0c;如何实现一个交换函数&#x…

企业有必要使用OVSSL证书吗?

在数字化时代&#xff0c;SSL证书不仅仅是一种技术保障&#xff0c;它更是企业线上服务的重要组成部分。企业级OVSSL证书以其独特的优势&#xff0c;为企业带来了多重好处。 包含以下几点&#xff1a; 1、增强信任度&#xff1a;OV SSL证书在颁发前会对组织的身份进行验证&…

找出一个整型数组中的元素的最大值

这个问题在之前的文章中曾用其他方法解决&#xff0c;现在用类来处理&#xff0c;读者可以比较不同方法的特点。 编写程序&#xff1a; 运行结果&#xff1a; 程序分析&#xff1a; 程序看起来比较长&#xff0c;其实并不复杂&#xff0c;它包括以下3部分&#xff1a;…

生产实习Day13 ---- 神经网络模型介绍

文章目录 传统的神经网络模型注意力机制的引入注意力机制的本质Encoder-Decoder 框架注意力机制在 Encoder-Decoder 中的应用Self-Attention 机制Transformer 模型注意力机制的优势总结 传统的神经网络模型 在深度学习中&#xff0c;传统的神经网络模型&#xff0c;如循环神经…

【离散数学】图的随机生成和欧拉(回)路的确定(c语言实现)

实验要求 变量定义 因为如果我们使用局部变量&#xff0c;每一个函数都会使用这些变量&#xff0c;会让函数的参数越变越多。所以我们定义全局变量&#xff0c;这样就不用在参数中调用了。 #define MAX 100 int arrMap[MAX][MAX] { 0 };//图的矩阵 int degree[MAX] { 0 };…

[职场] 提升学历考研再就业有必要吗 #其他#知识分享

提升学历考研再就业有必要吗 有很多人觉得自己学历不够高&#xff0c;求职第一关可能就通过不了。因此想要继续攻读&#xff0c;最近有人问小编提升学历考研有必要吗&#xff1f;“硕士学历和三年的工作经验哪个更重要?” 这个还是要针对具体岗位而言。综合类型的岗位往往不需…

免费分享:2000-2020年中国长时间序列夜间灯光数据集(附下载方法)

夜间灯光数据集直观反映了地表夜间灯光亮度&#xff0c;进而揭示了人类活动强度&#xff0c;为分析城市扩张、人口迁移、经济发展等提供了连续、全面的视角&#xff0c;有助于深入理解中国城市化的历史进程和未来趋势。 数据简介 基于DMSP/OLS第四版非辐射定标夜间年平均灯光强…

【HW必备】用友NC-Cloud存在17处漏洞合集

漏洞简介 NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构&#xff0c;技术先进、性能稳定、自主安全可控&#xff0c;支撑大中型以及超大型集团企业N层多site混合云部署方案&#xff0c;支持整个系统高可…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第47课-动态切换内嵌blender展厅的壁画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编…