CYQ.Data 快速开发之UI(赋值、取值、绑定)原理

昨夜园子猴子问了几个我CYQ.Data使用的小问题,经过简单解答后,他表示“妈妈再也不用担心我的学习",并于事后以资鼓励,希望这框架越走越好。

除了技术上的交流,双方在生活,S上面的问题上也进行了双边友好交流,最后猴子给发了一个国外的Sex网站,对此分享行为,我表示高度赞赏。

 

好了,言归正题,讲点技术问题:

CYQ.Data 的使用操作方式,已经有相关文章介绍了,就不再介绍了。
本节就讲一下实现原理,具体源码,可直接下载开源的V4.0可以学习。
下载地址:http://www.cyqdata.com/download/article-detail-426

 

 

CYQ.Data 支持的UI:WebForm和Winform 及实现原理:

 

涉及的内部2个类和一个接口:

 

 

MActionUI:

主要是对单行数据的操作,将单行的数据赋值到WebForm的服务器控件或Winform的控件。

 

其功能就是对UI控件单个取值和赋值,而新增的SetAll,可以批量把值赋值控件。

示例代码:

            using (MAction action = new MAction("Users"))
            {
                if (action.Fill(id))
                {
                    action.SetToAll(this);
                }
            }

 

就这么一行SetToAll(this),就秒杀了以前的N多的类似以下的代码:


txtID.Text = XXX.值1;
txtUserName.Text = XXX.值2;
txtFullName.Text = XXX.值3;
txtEmailName.Text = XXX.值4;
txtPassword.Text = XXX.值5;
....省略N个..... 

 

而且带来的好处是,就算添加或减少字段显示项,只要把页面的控件去掉即可,并不即改动代码。

 

那这个功能实现原理是什么?

其实就是“this",等于传进了当前Page,然后只要遍历Page的子控件,根据约定的“三个字母前缀”+字段名,就可以循环设置值了。

 

MBindUI:

主要是对多数据的操作,将多行的数据绑定到WebForm或Winform的GridView,Repleater,DropDownList等列表控件。

 

其功能其实很简单,就是绑定列表控件,看以下以下代码,大致就能理解了:

  public static void Bind(object ct, object source)
        {
            if (ct is GridView)
            {
                ((GridView)ct).DataSource = source;
                ((GridView)ct).DataBind();
            }
            else if (ct is Repeater)
            {
                ((Repeater)ct).DataSource = source;
                ((Repeater)ct).DataBind();
            }
            else if (ct is DataList)
            {
                ((DataList)ct).DataSource = source;
                ((DataList)ct).DataBind();
            }
            else if (ct is DataGrid)
            {
                ((DataGrid)ct).DataSource = source;
                ((DataGrid)ct).DataBind();
            }
            else if (ct is Win.DataGrid)
            {
                ((DataGrid)ct).DataSource = source;
            }
            else if (ct is Win.DataGridView)
            {
                ((System.Windows.Forms.DataGridView)ct).DataSource = source;
            }
            else if (ct is BaseDataList)//基类处理
            {
                ((BaseDataList)ct).DataSource = source;
                ((BaseDataList)ct).DataBind();
            }
        }

通过多个分支,设置数据源的值,而经典的使用方式就是:

            using (MAction action = new MAction("Users"))
            {
                action.Select().Bind(gvUsers);
            } 

 

当然,这并不是最佳性能的使用方式,因为列表控件的绑定,最好是在数据库链接关闭后再绑定,最佳性能写法应该下:


            MDataTable dt;
            using (MAction action = new MAction("Users"))
            {
                dt = action.Select();
            }
            dt.Bind(gvUsers); 

IUIValue:

这是一个支持自定义控件或第三方控件的接口,只要控件实现接口,也可以使用MActionUI的功能。

三个属性,控件是否启,控件ID,控件的值,这个一般只有自己编写的自定义控件才会使用到。

 

UI这一块差不多就讲到这里了,实现还算简单,但思路却是多年经验步步优化累积而来。

传统非UI开发模式: 

 

除开WebForm,事实还有很多种开发模式,但万变不离其宗的是,本质是html元素通过GET、POST等方式提交与服务端交互。
而这种交互中间,最常见的就是js,而交互的格式,json是深受喜爱的。

 

 

所以CYQ.Data 也考虑到这种开发模式的快速开发方式,通过GetFromJson与ToJson功能,实现简单后端编码:

示例代码如:


            string result;
            using (MAction action = new MAction("Users"))
            {
                if (action.Fill(id))
                {
                    result=action.Data.ToJson();
                }
            }
            Response.Write(result); 

通过返回Json到客户端,由客户端js解析并显示。

 

同样的返过来批量取值:


            bool result;
            using (MAction action = new MAction("Users"))
            {
                action.GetFromJson(Request["json"]);
                result = action.Insert();
            }
            Response.Write(result); 

由客户端js提交json格式的数据,而后台固定自动解析,入库,相当方便。

OK,本节就介绍到这里,谢谢观赏。 


版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/p/3143488.html

时间: 2024-12-30 06:16:16

CYQ.Data 快速开发之UI(赋值、取值、绑定)原理的相关文章

CYQ.Data 快速开发EasyUI

EasyUI: 前端UI框架之一, 相对ExtJs来说,算是小了,这两天,抽空看了下EasyUI的相关知识,基本上可以和大伙分享一下: 官网: http://www.jeasyui.com/ 学习的话,基本上思路就三个: 一个是Demo,把所有提供的Controls看一遍,然后用到哪个,就去看哪个. 一个是Document,如果某个控件需要用JS编码控制,可能需要看一下相关的API提供的属性,事件和方法. 一个是搜相关的文章,看看一些网上的示例或教程文章.   由于EasyUI是基于JQ的语法,

CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0版本的支持. 支持WPF的起因: CYQ.Data 一直是基于2.0语法下支持开发的框架,在未直接支持WPF之前,对于控件列表的绑定,因为WPF竟然不支持DataTable,研究后发现需要从MDataTable.ToDataTable().DefaultView来转一次绑定:另外对于UI控件,也只能

CYQ.Data 轻量数据层之路 MDataTable 绑定性能优化之章(十一)

昨天jyk进群后,用Microsoft Application Center Test 对CYQ.Data 框架进行进行了一下压力测试 然后截了几张图上来,只有纯图如下: 1:使用了框架:sql 2000的分页存储过程[临时表分的页]: 2:把存储过程直接换成select语句: 3:他的框架测试结果: 4:这是测试结果了. 以下是说明: 1.DataTable :714次/秒 2.MDataTable:559 次/秒 (简单存储过程) 3.MDataTable:500 次/秒 (完整存储过程)

基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]

前面几篇给大家系统讲解的有关xmpp openfire smack asmack相关的技术和使用,大家如果有所遗忘可以参考 基于xmpp openfire smack开发之openfire介绍和部署[1] 基于xmpp openfire smack开发之smack类库介绍和使用[2] 基于xmpp openfire smack开发之Android客户端开发[3]   顺便也一起回顾下xmpp的历程 xmpp协议起源于著名的Linux即时通讯服务服务器jabber,有时候我们会把xmpp协议也叫j

struts2中页面取值的原理以及valueStack的应用

  一个简单的用struts2标签代码获取action中属性的例子   <table border="1" width="360">    <caption>     作者李刚的图书    </caption>    <!-- 迭代输出ValueStack中的books对象,其中status是迭代的序号 -->    <s:iterator value="books" status="

Android项目开发之UI设计器_Android

开发人员可以用以下两种方式声明UI:一是通过.xml文件(不带预览界面)或者.axml文件(带预览界面)来描述:二是用C#代码实现.  用.axml文件描述用户界面(UI)时,设计器分为[设计]视图和[源]视图.这种方式的优点是:可以尽可能地把表现与控制行为的代码分隔开.就是说,可以直接修改XML而不需要重新编译.另外,还可以让UI结构可视化以及调试都变得更容易. 1.布局文件(.xml和.axml)  在XML中声明UI之后,必须将其以.xml扩展名或者.axml扩展名保存在Android项目

Android项目开发之UI设计器

开发人员可以用以下两种方式声明UI:一是通过.xml文件(不带预览界面)或者.axml文件(带预览界面)来描述:二是用C#代码实现.  用.axml文件描述用户界面(UI)时,设计器分为[设计]视图和[源]视图.这种方式的优点是:可以尽可能地把表现与控制行为的代码分隔开.就是说,可以直接修改XML而不需要重新编译.另外,还可以让UI结构可视化以及调试都变得更容易.  1.布局文件(.xml和.axml)  在XML中声明UI之后,必须将其以.xml扩展名或者.axml扩展名保存在Android项

快速开发之Myeclipse快捷键

提示所有快捷键的快捷键是 ctrl+shift+L 菜单是在: window-->preferences-->general-->keys 提供能容帮助是 alt+/ Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+↑ 当前行和上面一行交互位置(同上) Alt+←

IOS开发之UI布局

前言:本篇随笔会经常更新,随着本人对布局的深入学习,会不断补充新的知识.新的使用技巧.新的认识等等.   1.Autoresizing(在代码中使用) 先简单的看看下面的代码,以及左边运行出来的效果,然后后面就会对iPhone模拟器进行旋转,再看看效果,然后结合代码中的autoresizingMask属性来体会一下: 横屏之后,说明竖屏默认的frame(0,0,100,500)换到横屏之后会默认在中间一些的位置,但是因为上面设置autoresizingMask属性是左边和上边自动伸缩: 以上就是