95992828九五至尊2

毋庸重新编写翻译代码,不应用反射

二月 26th, 2019  |  882828九五至尊手机版

   
近年来在跟朋友一块谈谈工作流系统中自定义表单的标题,那个表单用于流程节点的多寡处理,比如在请假流程中筹划三个请假单。为了使工作流具有很高的油滑,往往须求为客户定制表单,有2种格局来拍卖这一个难题:

问题篇:

   
明天在CSDN看到那般二个帖子:“苦逼的三层代码”:

采用传统的三层架构写代码,每个数据表都要定义一个实体对象,编写后台的时候,
Web层需要针对页面的用户输入逐个手动编写赋值到实体对象的各个属性,然后DAL层还要用SqlHelper 进行各个存储过程对应参数的实体赋值,
我的天呀,写几个表还好,多个表呢,
写的后台都没力气,
典型的苦逼代码工没营养,各位有啥好的处理方法或开发方式。。  

 

   
看到跟帖,大多数都说利用OTucsonM消除那么些难点,但自笔者以为OPRADOM依然尚未化解贴主的多少个难点:

  1. 各样数据表都要定义三个实体对象
  2. 页面包车型大巴用户输入每一种手动编写赋值到实体对象的逐一属性
  3. 表很多,代码重复量大,典型的苦逼代码工

   
其它跟帖中也有数不胜数上用动软的三层代码生成器,那个主意看似能够消除部分题材,但无法不接纳代码生成器规定的那种三层构造,不方便人民群众灵活扩充,而且遇上事情稍复杂的意况,也不是代码生成器能够化解的标题。

   
实际上,对于难点1,难点2,大家遵照一定规则,使用反射是能够缓解对象属性手工业各个赋值、取值的进度的,须要大家温馨完美制定那一个规则。这里作者动用其它一种方案,不利用反射,“一行代码”完成Web、WinForm窗体表单数据的填写、收集、清除,和到数据库的CRUD,而秘诀便是对表单控件举行增添。

  1. 由程序员为某客户定制开宣布单;
  2. 由客户在线设计表单。

原理篇:

    大家常用的表单控件主要有以下多少个:

  • CheckBox、
  • DropDownList、
  • Label、
  • ListBox、
  • RadioButton、
  • TextBox

    大家对那一个控件实行扩展,让它统一继承一个数据接口 IDataControl:

882828九五至尊手机版 1882828九五至尊手机版 2IDataControl接口

        /// <summary>
    /// 数据映射控件接口
    /// </summary>
    public interface IDataControl
    {

        /// <summary>
        /// 与数据库数据项相关联的数据
        /// </summary>
        string LinkProperty
        {
            get;
            set;
        }

        /// <summary>
        /// 与数据关联的表名
        /// </summary>
        string LinkObject
        {
            get;
            set;
        }

        /// <summary>
        /// 是否通过服务器验证默认为true
        /// </summary>
        bool IsValid
        {
            get;
        }



        /// <summary>
        /// 数据类型
        /// </summary>
        TypeCode SysTypeCode
        {
            get;
            set;
        }

        /// <summary>
        /// 只读标记
        /// </summary>
        bool ReadOnly
        {
            get;
            set;
        }


        /// <summary>
        /// 是否允许空值
        /// </summary>
        bool isNull
        {
            get;
        }

        /// <summary>
        /// 是否是主键
        /// </summary>
        bool PrimaryKey
        {
            get;
            set;
                                  }



        /// <summary>
        /// 设置值
        /// </summary>
        /// <param name="obj"></param>
        void SetValue(object value);

        /// <summary>
        /// 获取值
        /// </summary>
        /// <returns></returns>
        object GetValue();

        /// <summary>
        /// 服务端验证
        /// </summary>
        /// <returns></returns>
        bool Validate();

    }

882828九五至尊手机版,   
稍后咱们来讲那几个接口的实际使用,上边,我们定义多少个新的数目控件,来再而三这一个接口:
    注:上边以WinForm控件为例子,WebForm与之接近。

public partial class DataCalendar : DateTimePicker, IDataControl
{
//数据日历控件
}

public partial class DataCheckBox : CheckBox, IDataControl
{
//数据复选框控件
}

public partial class DataDropDownList : ComboBox, IDataControl
{
//数据下拉选择框控件
}

public class DataLabel : Label, IDataControl
{
//数据标签控件
}

public partial class DataListBox : ListBox, IDataControl
{
//数据列表框控件
}

public partial class DataRadioButton : RadioButton, IDataControl
{
//数据选项按钮控件
}

public class DataTextBox : TextBox, IDataTextBox
{
//数据文本框控件
}

    有了那几个扩充的表单控件,大家只要求调用它的接口方法,举行赋值和取值:

DataTextBox dtb=new DataTextBox();
dtb.SetValue("text1");
string value=dtb.GetValue().ToString();//text1

    而在DataTextBox的那三个接口方法完结中,是不需求动用反射的:

       public void SetValue(object obj)
        {
            if (obj == null || obj.ToString() == "")
            {
                this.Text = "";
                return;
            }
            //其它检测和格式控制代码略
            this.Text = obj.ToString().Trim();
        }

        public object GetValue()
        {
           //其它检测和格式控制代码略
            return this.Text.Trim();
        }

   
有了数额控件的那2个接口方法,大家对种种数据控件实行合并的多寡收集、填充就很简单了,无非就是遍历一下窗体下边包车型的士数据控件,找到它们然后二个个拍卖即可,具体代码前面包车型地铁实例会说到。

   
既然说到表单数据的填充,将查询出来的数据集中哪个表的某些字段和哪个控件对应呢?
    那就用到了IDataControl接口的上边二个天性了:

string LinkProperty{get;set;}//对应字段名或者实体类的属性名
string LinkObject{get;set;}//对应表名或者实体类的类名称

   
OK,有了IDataControl接口的那多少个接口方法和个性,不行使反射,封装一下,“一行代码”完结Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD,也就不是难点了。

   
分明,方法1推行资金财产较高,方法2开发开销很高,但使用成本较低。但对此软件公司来说一旦选用方法2开销出来一套工作流系统,那么中期推行和客户采取就很有益于了,所以也有众多工作流系统提供了“表单设计器”,来在线设计工作流表单。

实战篇:

   
遵照那个办法,笔者在PDF.NET开发框架中贯彻了本文标题说的效益,方今还做了二个简便的事例,大家能够去开源项目网站下载:
    项目网址:
http://pwmis.codeplex.com 到下载页,选用“
PDF.Net_V4.6 WinForm 数据表单实例”这么些下载链接即可。

    上边说说那几个小程序的搭建进程,

    我们换3个角度,来看方法1和方法2的区分,发现他们的区分是:

1,新建项目

    首先创制三个WinForm程序项目,引入上边多少个DLL类库:

882828九五至尊手机版 3

 

  • 办法1,需求开发、编写翻译和布置程序;
  • 方法2,不须要重新编写翻译程序;

2,添加数码控件到工具箱

    因为是WinForm项目,所以大家引用了PWMIS.Windows.dll,
它含有了小编们供给的数目控件。
    找到该公文,将它拖入我们的工具箱:

882828九五至尊手机版 4

    添加前,在工具箱中追加一个项:PDF.NET
DataForm,然后在能源管理器中精选Windows数据控件组件的公文,将它“拖放”到刚刚建立的 PDF.NET
DataForm上边

 

882828九五至尊手机版 5

    那是拖放后,添加PDF.NET Windows 数据控件成功后的工具箱样子。

 

   
方法2的优势很引人侧目标,可是它必须先开发3个“表单设计器”,那几个设计器有的不难易行,有的复杂,复杂的设计器你仔细看看,会越看越象VS的WinFormWebForm
设计界面,设计窗口、工具栏、属性窗口周全。所以作者说,VS便是最好的“表单设计器”。在系统的最初,用VS来设计表单的根基界面,是很好的。对于特定客户,就是表单样式的调整、表单域的改动(常见的是新增几个温馨的字段)等。这几个时候,假诺那种调整能够脱离VS开发环境,即改即用,那就太好了。

3,添加数量窗体

    我们在主窗体上放置多少个按钮和2个网格控件,以便增、删、改、查询数据:

882828九五至尊手机版 6

    然后我们再新创立三个窗体 Form2
,在地方放置多少个我们要求的表单控件并设置好我们供给保留的表名称和相应的字段名称:

882828九五至尊手机版 7

 

   
对那个难题,笔者一度考虑过不少年华,小编发觉对于绝超越十分之五粗略的表单,都是为着录入、查看、修改数据行使的,没有太多的逻辑性,那么对于那类供给,大家得以将表单控件直接和数据库的表字段展开绑定,从而进行急速支付的。VS的WinForm\WebForm控件是足以这么做的,但它们要求事先绑定类型化的数据集(强类型的DataSet),而且该进程并不佳用,由于须要数据集,所以想不编写翻译程序是不容许的。

4,编写代码

   
大家得以换1个思路,假设表单能够活动采集和填充表单域的数量,那么不就足以自行和数据库绑定了呢?

    4.1,基础CRUD代码

   
窗体建立好了,未来启幕写代码,刚初阶还尚无数据库呢,那里大家是有Access数据库文件,方便大家测试,在“成立数据库”按钮事件之中写如下代码:

private void btnCreateDB_Click(object sender, EventArgs e)
        {
            string dbpath = Application.StartupPath + "\\TEST.mdb";
            if (!File.Exists(dbpath))
            {
                //创建数据库文件
                PWMIS.AccessExtensions.AccessUility.CreateDataBase(dbpath);
                //创建表
                Access access = new Access();
              access.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + dbpath;

              PWMIS.AccessExtensions.AccessUility.CreateTable(access, new User());
                //配置连接
                PWMIS.AccessExtensions.AccessUility.ConfigConnectionSettings("AccessConn", dbpath);

                MessageBox.Show("创建数据成功!");
                this.btnInsert.Enabled = true;
                this.btnUpdate.Enabled = true;
                this.btnDelete.Enabled = true;
            }
            else
            {
                MessageBox.Show("数据库已经创建过了,如需重新创建,请先删除数据库文件。");
            }

        }

    注意,大家并从未手工业去创建数据表,而是选拔优先定义好的PDF.NET实体类
User,在Access数据库中自行创造了2个数据表的:

 PWMIS.AccessExtensions.AccessUility.CreateTable(access, new User());

   
User实体类的概念相当粗略,它里面指明了实体类将要映射到的表名和实体类属性映射的字段名:

882828九五至尊手机版 8882828九五至尊手机版 9User实体类定义

public class User:EntityBase
    {
        public User()
        {
            this.TableName = "会员用户表";
            this.IdentityName = "标识";
            this.PrimaryKeys.Add("标识");
        }

        protected override void SetFieldNames()
        {
            PropertyNames = new string[] {"标识","用户名","用户类型","注册时间","消费金额" };
        }

        public int UserID
        {
            get { return getProperty<int>("标识"); }
            set { setProperty("标识", value); }
        }

        public string UserName
        {
            get { return getProperty<string>("用户名"); }
            set { setProperty("用户名", value, 50); }
        }

        public int UserType
        {
            get { return getProperty<int>("用户类型"); }
            set { setProperty("用户类型", value); }
        }


        public DateTime RegisterDate
        {
            get { return getProperty<DateTime>("注册时间"); }
            set { setProperty("注册时间", value); }
        }

        public Single Expenditure
        {
            get { return getProperty<Single>("消费金额"); }
            set { setProperty("消费金额", value); }
        }
    }

   实体类是优先手写好的,表结构是后来程序运维时创立的,那也终于PDF.NET的CodeFirst 功能吧!

    下边,写主窗体的数量加载代码:

 List<User> list = OQL.From<User>().Select().END.ToList<User>();
this.dataGridView1.DataSource =list;

   
这里用上了PDF.NET框架的OQL扩充,一行代码查询数据,需重要项目目引用PWMIS.Core.Extensions.dll
以及
    using
PWMIS.Core.Extensions;

 

    修改数据也是单排代码:

 User user = this.dataGridView1.CurrentRow.DataBoundItem as User;
 EntityQuery<User>.Instance.Update(user);

 

    重头戏在我们的Form2.cs
中,我们看看提交按钮里面,是怎么收集、更新表单数据的:

 private void btnSubmit_Click(object sender, EventArgs e)
{
  //前面检查数据的代码略
   var ibCommandList = MyWinForm.Instance.AutoUpdateIBFormData(this.Controls);
}

   
就这一行代码就足足了,不必要使用其余实体类之类的,间接保存(Insert、Update)数据到数据库,框架会活动判断当前是增创依然修改,而基于正是看“主键数据控件”是不是有值。

    要是要化解表单数据,重新录入数据也很简短:

  private void btnClear_Click(object sender, EventArgs e)
        {
            WinFormControlDataMap.ClearData(this.Controls);
        }

 

   
该意义正是PDF.NET的智能表单控件提供的,表单控件都一连于IDataControl
接口,它定义了控件与数据库、实体类的投射:

    4.2,多窗体之间的多少同步   

   
在我们这几个小例子中,表单窗体(Form2)的数码变动后(新增、修改),能够即时反馈到主窗体(Form1)上,而不用主窗体去重新加载数据,那里就不能不用到数量绑定集合:

 private BindingList<User> UserBindingList = new BindingList<User>();
//填充集合的代码,就是将数据从数据库查询出来,然后放到该集合中,代码略
this.dataGridView1.DataSource = UserBindingList;

    光有BindingList<T>
集合还不够,它的积极分子对象还必须落成“属性更改布告”接口INotifyPropertyChanged,而PDF.NET的实体类正好实现了该接口:

public abstract class EntityBase : INotifyPropertyChanged, IEntity, ICloneable
{
//... 略
}

   
因而用PDF.NET的实体类来做WinForm、WPF、SL等窗体的多少Model是很适用的,适合在MVVM,MVP形式的项目中采用。

   

   
下边,使用框架提供的表单数据收集效能,就很容易的将数据搜集到实体类,然后共同立异主窗体的列表数据了,也是单排代码:

 Form1 form1 = this.Owner as Form1;
 User user = form1.GetUserByID(int.Parse(dlbUID.Text));
 //收集数据到实体类中
WinFormControlDataMap.CollectDataToEntityClass(user, this.Controls);

 

882828九五至尊手机版 10882828九五至尊手机版 11IDataControl

5,实例效果

最终,大家来探视那几个效果的周转效果图:

882828九五至尊手机版 12

充实数据,在新窗体中录入数据

 

882828九五至尊手机版 13

单击按钮保存数据,主窗体列表中自动增添一行数据

 

882828九五至尊手机版 14

新窗口先不闭馆,修改下消费金额,鲜明,发现主窗口列表的数据被同台修改了。

整整进程没有从数据库去重新刷新数据到主窗口网格控件的,完毕了八个窗体之见的多少同步。

 

 

 ———–分界线————————

 迎接到场PDF.NET开发框架 开源技术公司

PDF.NET Ver4.6 开源稳定版宣布

 

/// <summary>
    /// 数据映射控件接口
    /// </summary>
    public interface IDataControl
    {

        /// <summary>
        /// 与数据库数据项相关联的数据
        /// </summary>
        string LinkProperty
        {
            get;
            set;
        }

        /// <summary>
        /// 与数据关联的表名
        /// </summary>
        string LinkObject
        {
            get;
            set;
        }

        /// <summary>
        /// 是否通过服务器验证默认为true
        /// </summary>
        bool IsValid
        {
            get;
        }



        /// <summary>
        /// 数据类型
        /// </summary>
        TypeCode SysTypeCode
        {
            get;
            set;
        }

        /// <summary>
        /// 只读标记
        /// </summary>
        bool ReadOnly
        {
            get;
            set;
        }



        /// <summary>
        /// 是否允许空值
        /// </summary>
        bool isNull
        {
            get;
//            set;
        }

        /// <summary>
        /// 是否是主键
        /// </summary>
        bool PrimaryKey
        {
            get;
            set;
                                  }


        /// <summary>
        /// 设置值
        /// </summary>
        /// <param name="obj"></param>
        void SetValue(object value);

        /// <summary>
        /// 获取值
        /// </summary>
        /// <returns></returns>
        object GetValue();

        /// <summary>
        /// 服务端验证
        /// </summary>
        /// <returns></returns>
        bool Validate();

    }

    在该接口中,有1个至关心珍重要的属性:

  • LinkObject:与数据库相关的数据表可能实体类类型名称
  • LinkProperty:与数据库数据表相关联的字段或许实体类的属性

    大家将常用的表单控件:

  • CheckBox、
  • DropDownList、
  • Label、
  • ListBox、
  • RadioButton、
  • TextBox

  都持续下IDataControl
接口,那么它们就足以处理多少了,比如加载数据、获取数据,而那个表现,又经过框架的表单数据搜集、填充方法来自动达成的:

/// <summary>
/// 收集窗体中的智能控件,组合成能够直接用于数据库插入和更新 查询的 SQL语句
/// 一个窗体中可以同时处理多个表的数据操作
/// 如果控件的数据属性设置为只读,那么该控件的值不会更新到数据库;如果该控件的数据属性设置为主键,那么更新语句将附带该条件
/// </summary>
/// <returns>
/// ArrayList 中的成员为 IBCommand 对象,包含具体的CRUD SQL
///</returns>
 public static List<IBCommand> GetIBFormData(ControlCollection Controls,CommonDB DB)

以该措施为底蕴,达成表单数据的换代和填充方法:

  /// <summary>
/// 自动更新窗体数据
/// </summary>
 /// <param name="Controls">控件集合</param>
/// <returns></returns>
 public List<IBCommand> AutoUpdateIBFormData(ControlCollection Controls);

/// <summary>
/// 自动填充智能窗体控件的数据
/// </summary>
/// <param name="Controls">要填充的窗体控件集和</param>
public void AutoSelectIBForm(ControlCollection Controls);

 

OK,有了那3个艺术,大家早已得以落成“一行代码更新表单”了!

//保存数据
List<IBCommand> ibCommandList = MyWebForm.Instance.AutoUpdateIBFormData(this.Controls);

/////////////////////

//填充数据
MyWebForm.Instance.AutoSelectIBForm(this.Controls);

但那不是本文的主旨,本文是说怎么不重复编译程序,在线修改表单。

咱俩用实例来表达那个历程:

1,首先,到
PDF.NET的开源项目网站下载二个“超级市场级管制理种类”的示范程序,下载地址:

http://pwmis.codeplex.com/

2,依照网站求证,在当地配置好运转环境,基本上正是创制3个数据库,执行建表脚本,编译、宣布到2个IIS站点下。

3,运转“超级市场级管制理种类”网站,以管理员登陆(账号参见网站源码表明),实行雇员管理、设备管理等操作,为系统装置基本的多少。
PS:1,2,3步能够大致,大家能够平素登录超市级管制理连串实例网站(http://221.123.142.196)。

4,看到装备管理界面,你将相会到下图:

[设计界面]

882828九五至尊手机版 15

[运行时]

882828九五至尊手机版 16

5,找到您本地IIS中中国足球球组织一流联赛市网站站点下的文本 GoodsManage\StockInfo.aspx
,然后在表单中增添下边包车型地铁HTML代码,添加3个“经手人”数据控件,其余网格控件和分页控件也都充足经手人信息:

[图]

882828九五至尊手机版 17

[HTML代码]

882828九五至尊手机版 18882828九五至尊手机版 19ASPX

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="StockInfo.aspx.cs" Inherits="SuperMarketWeb.GoodsManage.StockInfo" %>
<%@ Register assembly="PWMIS.Web" namespace="PWMIS.Web.Controls" tagprefix="cc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <style type="text/css">
        .style4
        {
            height: 26px;
        }
    </style>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<table style="background-color:#DEBA84;border-color:#DEBA84;border-width:1px;border-style:None;" id="tbGoosBaseInfo" runat="server">
       <tr style="color:#8C4510;background-color:#FFF7E7;">
<td >[存货记录号]*</td><td >
           <cc1:DataLabel ID="dlCHJLH" runat="server" DataFormatString="" isNull="True" 
               LinkObject="存货信息表" LinkProperty="存货记录号" PrimaryKey="True" ReadOnly="True" 
               SysTypeCode="Int32"></cc1:DataLabel></td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td >[商品名称]</td><td >
           <cc1:DataDropDownList ID="ddlGoodsNames" runat="server" LinkObject="" 
               LinkProperty="" SysTypeCode="String" AutoPostBack="True" 
               onselectedindexchanged="ddlGoodsNames_SelectedIndexChanged" 
               >
           </cc1:DataDropDownList>
           </td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td class="style4" >[厂商]</td><td class="style4" >
           <cc1:DataDropDownList ID="ddlManufacturer" runat="server" LinkObject="" 
               LinkProperty="" SysTypeCode="String">
               <asp:ListItem Selected="True">请选择</asp:ListItem>
           </cc1:DataDropDownList>
                                <cc1:DataTextBox ID="dtbSN" runat="server" LinkObject="存货信息表" 
                                    LinkProperty="条码号" SysTypeCode="String" Width="78px" Type="Currency" 
                                    Visible="False"></cc1:DataTextBox>
           </td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td >[售价]</td><td >
                                <cc1:DataTextBox ID="DataTextBox3" runat="server" LinkObject="存货信息表" 
                                    LinkProperty="售价" SysTypeCode="Decimal" Width="128px" Type="Currency" 
                                    OftenType="浮点数"></cc1:DataTextBox>
           </td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td>[成本价]</td><td >
           <cc1:DataTextBox ID="DataTextBox4" runat="server" LinkObject="存货信息表" 
               LinkProperty="成本价" SysTypeCode="Decimal" width="128px" 
               OftenType="浮点数"></cc1:DataTextBox>
           </td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td>[生产日期]</td><td >
           <cc1:DataCalendar ID="DataCalendar3" runat="server" LinkObject="存货信息表" 
               LinkProperty="生产日期" ScriptPath="../Calendar/" ReadOnly="False" />
           </td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td>[上货时间]</td><td >
           <cc1:DataCalendar ID="DataCalendar2" runat="server" LinkObject="存货信息表" 
               LinkProperty="上货时间" ScriptPath="../Calendar/" ReadOnly="False" />
           </td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td>[库存数量]</td><td >
           <cc1:DataTextBox ID="DataTextBox6" runat="server" LinkObject="存货信息表" 
               LinkProperty="库存数量" SysTypeCode="Int32" Type="Integer" 
               OftenType="整数"></cc1:DataTextBox>
           </td></tr>
       <tr style="color:#8C4510;background-color:#FFF7E7;">
       <td >&nbsp;</td><td >
           <asp:Button ID="btnSave" runat="server" onclick="btnSave_Click" Text="保存" />
           <asp:Button ID="btnNew" runat="server" onclick="btnNew_Click" Text="新建" />
           <asp:Button ID="btnDelete" runat="server" onclick="btnDelete_Click" Text="删除" />
           </td></tr>
       </table>
       <p>

           <asp:Label ID="lblMsg" runat="server" Text="操作"></asp:Label>

       </p>

       <asp:GridView ID="GridView1" runat="server" BackColor="#DEBA84" 
        BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
        CellSpacing="2" onselectedindexchanged="GridView1_SelectedIndexChanged">
        <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
        <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
        <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
        <Columns>
            <asp:ButtonField CommandName="Select" HeaderText="选择" ShowHeader="True" 
                Text="编辑" />
        </Columns>
    </asp:GridView>
   <cc1:ProPageToolBar ID="ProPageToolBar1" runat="server" BackColor="#FFF7E7" 
        BorderColor="#DEBA84" BorderWidth="1px" ForeColor="#8C4510" PageSize="5" 
        AutoBindData="True" AutoConfig="True" AutoIDB="True" BindToControl="GridView1" 
        SQL="SELECT [存货记录号],[条码号],[售价],[成本价],[生产日期],[上货时间],[库存数量]  FROM [存货信息表] order by [存货记录号] desc" />

</asp:Content>

封存该页面的修改。

6,在您的数据库的“存货新闻表”中加进二个“经手人”字段,字符串类型,长度50。

7,重新刷新网页,表单界面是还是不是多了一个“经手人”新闻?
效能如下图:

882828九五至尊手机版 20

然后再在该表单中展开数量的增多、修改操作,是否打响了?

8,结束了。
呵呵,通过该办法,是或不是达成了您的“无需再次编写翻译在线修改表单”的机能?假设开发一个工具,让用户以图形化的法门来修改表单音讯,那就是当真的在线表单修改工具了。

PS:PDF.NET的多少表单效能是框架最早有所的功力,但现行反革命流行MVC开发,WebForm开发就如不流行了,但本人以为在同盟社费用世界依然大有可为,恐怕,本文至少为您提供了消除此类难题的3个缓解方案,希望能够对你有所支持。


迎接参预PDF.NET开源技术团队,做最快最轻的多少框架!


连带链接:

LJMM平台( Linux +Jexus+MySQL+mono)
上应用MySQL的简易总计

 

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图