昨夜园子猴子问了几个我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,本节就介绍到这里,谢谢观赏。 

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

  1. Android Studio快速开发之道

    概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...

  2. CYQ.Data 快速开发EasyUI

    EasyUI: 前端UI框架之一, 相对ExtJs来说,算是小了,这两天,抽空看了下EasyUI的相关知识,基本上可以和大伙分享一下: 官网: http://www.jeasyui.com/ 学习的话 ...

  3. CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本

    CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...

  4. TextBox只读时不能通过后台赋值取值解决办法

    给页面的TextBox设置ReadOnly="True"时,在后台代码中不能赋值取值,下边几种方法可以避免:  1.不设置ReadOnly,设置onfocus=this.blur( ...

  5. Python_关于多线程下变量赋值取值的一点研究

    关于多线程下变量赋值取值的一点研究 by:授客 QQ:1033553122 1.代码实践1 #!/usr/bin/env python # -*- coding:utf-8 -*- __author_ ...

  6. Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值

    Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值 说到循环遍历,最常见的遍历数组/列表.Map等.但是,在开发过程中,有时需要循环遍历一个对象的所有属性.遍历对象的属性该如何遍历呢?查了 ...

  7. ASP.Net TextBox只读时不能通过后台赋值取值

    给页面的TextBox设置ReadOnly="True"时,在后台代码中不能赋值取值,下边几种方法可以避免: 1.不设置ReadOnly,设置onfocus=this.blur() ...

  8. spark快速开发之scala基础之3类,对象,特征

    类 scala的类定义非常灵活 class test4 class test2{} class test3(x:Int) 定义一个带构造函数的类 class Point (x : Int,y : In ...

  9. spark快速开发之scala基础之1 数据类型与容器

    写在前面 面向java开发者.实际上,具有java基础学习scala是很容易.java也可以开发spark,并不比scala开发的spark程序慢.但学习scala可有助于更快更好的理解spark.比 ...

随机推荐

  1. CVE-2015-7645 analyze and exploit

    Hack team之后adobe和google合作对flash进行了大改,一度提高了flash的利用门槛,CVE-2015-7645作为第一个突破这些限制的漏洞利用方式,可以作为vetect利用方式之 ...

  2. Linux学习笔记(12)-进程间通信|匿名管道

    Linux的进程间通信有几种方式,包括,管道,信号,信号灯,共享内存,消息队列和套接字等-- 现在一个个的开始学习! ----------------------------------------- ...

  3. [NHibernate]利用LINQPad查看NHibernate生成SQL语句

    上篇文章中我们提到可以通过重写NHibernate的 EmptyInterceptor 拦截器来监控NHibernate发送给数据库的SQL脚本,今天看到有朋友用LINQPad工具来进行NHibern ...

  4. EventLoop和EventLoopGroup

    Netty框架的主要线程就是I/O线程,线程模型设计的好坏,决定了系统的吞吐量.并发性和安全性等架构质量属性.Netty的线程模型被精心地设计,既提升了框架的并发性能,又能在很大程度避免锁,局部实现了 ...

  5. jquery轮播图详解,40行代码即可简单解决。

    我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jq ...

  6. TAQSkinScrollBar 类美化滚动条再讨论

    再说:TAQSkinScrollBar 类美化滚动条,http://www.138soft.com/?p=156  里面有人提到不可以滚动 滚动的改善方法: unit AQSkinScrollBar; ...

  7. 转:简单窗体振动-WaitForSingleObject,消息,winapi

    http://www.cnblogs.com/Jekhn/archive/2012/08/25/2656656.html 线程,消息函数,SetWindowPos设置窗体位置 if WaitForSi ...

  8. 打包如何打包额外文件,比如Sqlite数据库的db文件

    http://aigo.iteye.com/blog/2278224 Project Settings -> packaging -> Packaging选项中,有多个设置项来设置打包时要 ...

  9. webpack -p压缩打包react报语法错误处理

    前言:在用webpack打包react代码的时候发现一个问题,做一个处理总结. 我的webpack配置: var webpack = require('webpack'); //打包less插件 va ...

  10. DXUT源码阅读笔记

    14.GetCapture() 函数功能:该函数取得捕获了鼠标的窗口(如果存在)的句柄.在同一时刻,只有一个窗口能捕获鼠标:此时,该窗口接收鼠标的输入,无论光标是否在其范围内.函数原型:HWND Ge ...