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:Label
                    ID="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 的设置,这是根据项目实际的一些需要进行的功能实现。以上就是关于控件数据返写的介绍,我们可以根据自己的实际需要进行改造和控件识别的扩充,本示例代码仅供您参考。 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker(七)-Docker容器数据卷

1.容器数据卷是什么 卷就是目录或者文件&#xff0c;存在于一个或者多个容器中&#xff0c;由docker挂载到容器&#xff0c;不属于容器内(类似于笔记本电脑外的一个移动硬盘)。 卷的设计目的就是数据持久化&#xff0c;完全独立于容器的生存周期&#xff0c;因此Docker不会在容…

博图随机生成俄罗斯方块程序

一、程序结构 1.定义基础数据&#xff0c;俄罗斯方块图形共19中&#xff0c;使用WORD编码存储在数组内 2.添加随机生成int数值的FC函数块&#xff0c;生成1-19 的随机数 3.查找数组内图形显示在HMI画面上 二、程序 1.生成1-19 的随机数&#xff0c;并显示当前图形样式 2.生成按…

网页设计软件Bootstrap Studio6.7.1

Bootstrap Studio是一个适用于Windows的程序,允许您使用流行的fre***orca Bootstrap创建和原型网站。您可以将现成的组件拖动到工作区并直观地自定义它们。该程序生成干净和语义的PDF、CSS和JS代码,所有Web浏览器都支持这些代码。 Bootstrap Studio有一个漂亮而强大的界面,它…

Microsoft Edge浏览器安装crx拓展插件教程

1、首先打开edge浏览器&#xff0c;点击顶部地址栏。 2、在地址栏中输入"edge://flags/#extensions-on-edge-urls"并按下回车。2、在地址栏中输入"edge://flags/#extensions-on-edge-urls"并按下回车。 3、进入后&#xff0c;将图示选项改为“已禁用”。 …

邮件群发推送的方法技巧?有哪些注意事项?

邮件群发推送的策略如何实现&#xff1f;邮件推送怎么评估效果&#xff1f; 电子邮件营销是现代企业进行推广和沟通的重要工具。有效的邮件群发推送不仅能提高客户参与度&#xff0c;还能促进销售增长。AokSend将探讨一些关键的邮件群发推送方法和技巧&#xff0c;以帮助企业优…

现在本科录取率最高已达79%了。。。

郭震原创&#xff0c;手撸码字1035 你好&#xff0c;我是郭震 高考今天陆续出分&#xff0c;查了下去年高考本科录取率&#xff0c;排名第一的上海&#xff0c;已达到79.19%&#xff1a; 不知道诸位看到这个数字&#xff0c;有何感想&#xff1f; 1 本科含金量 1977年本科录取率…

ONLYOFFICE 桌面编辑器 8.1华丽登场

简介&#xff1a;全新ONLYOFFICE 桌面编辑器 8.1解锁全新PDF编辑、幻灯片优化与本地化体验&#xff0c;立即下载&#xff01; 前言&#xff1a;在数字化时代&#xff0c;高效的办公协作工具是企业和个人不可或缺的利器。ONLYOFFICE&#xff0c;作为一款功能强大的云端和桌面办公…

Ubuntu 20.04.3 LTS 安装打印服务器 局域网发现系统服务 共享给 windows 10/11 使用

ubuntu安装部署打印服务器可参考: Ubuntu 20.04.3 LTS 安装hp 1020 plus 打印机 通过cups共享给 windows 10/11 使用-CSDN博客 1 windows 10 ,局域网搜索不到共享的hp1020打印机 2 Ubuntu使用Avahi进行局域网服务发现和设备发现&#xff0c;安装avahi-daemon sudo apt-updat…

uniapp小程序button按钮去掉黑色线条

文章目录 导文去除方法 导文 在uniapp的button按钮中有一个莫名其妙的黑色线条 去除方法 button::after{border: none; }该问题并不是所有的手机机型都有&#xff0c;最好添加一下&#xff0c;以防用户手机端样式有问题。 您好&#xff0c;我是肥晨。 欢迎关注我获取前端学习…

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

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

【数据分享】2006-2023《中国贸易外经统计年鉴》

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

什么是“渠道精酿”?从FENDI CLUB看渠道改变

在我国消费市场上&#xff0c;最早喝上精酿啤酒的群体分别是留洋的学生、工厂酿酒师傅以及能够买到进口啤酒的爱好者&#xff0c;他们既是第一批接触精酿的人&#xff0c;也成为了中国精酿啤酒文化的传播者。可以说精酿是从小众到大众&#xff0c;从概念热到了渠道热。 “渠道精…

puppet运维自动化

在现代信息技术管理中&#xff0c;自动化运维工具的应用已成为企业提升效率、降低成本的关键手段之一。Puppet作为一种强大的运维自动化工具&#xff0c;因其高效、灵活和可扩展的特点&#xff0c;受到越来越多企业的青睐。本文将探讨Puppet在运维自动化中的应用&#xff0c;包…

跨平台数据库工具DataGrip v2024.1全新发布——升级数据处理功能

DataGrip 是一个跨平台的数据库工具可在Windows&#xff0c;OS X 和 Linux上使用。同时支持多种数据库&#xff0c;包含了SQL Server&#xff0c;Oracle&#xff0c;PostgreSQL&#xff0c;MySQL&#xff0c;DB2&#xff0c;Sybase&#xff0c;SQLite&#xff0c;Derby&#xf…

系统思考—结构影响行为

思‮问考‬题时&#xff0c;从“结构”的‮度角‬出发&#xff0c;能‮示揭‬许多不‮人为‬知的‮层深‬次真相。我‮常们‬认为“努‮必力‬有回报”&#xff0c;从‮误而‬信‮过通‬坚‮就持‬能‮抗抵‬诱惑。然而&#xff0c;如‮深果‬入理解“结‮影构‬响行为”&#…

数据库攻防之MongoDB

MongoDB是一个安全性相对较高的非关系型数据库&#xff0c;它的安全问题主要出现在使用、配置过程当中。目前随着MongoDB的流行&#xff0c;它也成为了红队攻防领域不可忽视的数据库。 0x01 MongoDB简介 MongoDB 是一个由C编写、基于分布式文件存储的开源数据库系统&#xff…

【CentOS7】Linux安装Docker教程(保姆篇)

文章目录 查看是否已安装卸载&#xff08;已安装过&#xff09;docker安装友情提示 更多相关内容可查看 注&#xff1a;本篇为Centos7安装Docker&#xff0c;若为其他系统请理性参考 查看是否已安装 如果已安装&#xff0c;请卸载重新安装 docker --version这里显示已安装 …

Linux网络 - 再谈、详谈UDP和TCP协议

文章目录 前言预备netstatpidofcat /etc/services 一、UDP协议UDP协议端格式UDP的缓冲区基于UDP的应用层协议 二、TCP协议1.TCP协议段格式确认应答(ACK)机制三次握手疑问1 最后一次客户端发给服务端的ACK请求怎么保证服务端能够收到&#xff1f; 四次挥手疑问2 为什么挥手是四次…

职场新宠:ONLYOFFICE——办公协作的得力助手

&#x1f3a0;前言 在快节奏的职场环境中&#xff0c;高效、便捷的办公软件成为每一位职场人士不可或缺的工作伙伴。当我们谈论职场办公软件时&#xff0c;许多人首先会想到Microsoft Office、wps等老牌软件。 然而&#xff0c;有一款宝藏的办公软件ONLYOFFICE&#xff0c;凭…

硬盘空间告急?监控服务器容量,钉钉及时提醒!

在日常的服务器维护中&#xff0c;硬盘容量的监控是非常重要的。如果硬盘容量超过某个阈值&#xff0c;可能会导致服务器无法正常运行&#xff0c;影响业务的正常运作。为了避免这种情况&#xff0c;我们可以编写一个Shell脚本&#xff0c;定期检查硬盘容量&#xff0c;当超过设…