傻瓜框架——零代码快速生产Mis系统
很久没有在自己的电脑上敲代码了,最近有个哥们问帮他改个CRM,拿到旧系统看了一下,标准的客户端程序,界面很简单左树右上卡片右下列表风格,点左面节点,右边展示,双击列表明细弹出CRUD画面。千篇一律,只有登录界面除外,原系统是C++做的又没源码,那唯一有用的就是这个Acess了。
N久没过过类似的项目了,到处在Google,baidu上 找WEB的Crud控件,试来试去都不合适,就打算着手写一个,着手用GridView控件改造,MSDN时发现了DetailsView控件,两者组合居然很Easy就解决CRUD问题了。

发现:两个控件组合后的代码很简单,一句代码就绑定了数据源,控件crud、翻页,排序的代码也很有规律:主键和CRUD的Command和Parameters。 这个发现很兴奋,这些信息过表的Assemble信息很容易查出。以前写过WEB页面通过OR映射生成项目实体类小工具,这个要简单很多。首先通过系统存储过程 “sp_helpdb”得出: 
在通过
代码
列出:

思考:1.需要一个能过完整CRUD(包括较复杂的带外键级联删除,级联更新)测试和布局加工后的标准页面做成.aspx和.cs模板,根据数据库表信息,自动生成所有表页面!
代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">※NewLine※※NewLine※
<html xmlns="http://www.w3.org/1999/xhtml">※NewLine※
<head runat="server">※NewLine※
<title></title>※NewLine※
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />※NewLine※
<link type="text/css" rel="Stylesheet" href="http://www.cnblogs.com/Style/Main.css" /> ※NewLine※
</head>※NewLine※
<body>※NewLine※
<form id="form1" runat="server">※NewLine※
<div> ※NewLine※
<table>※NewLine※
<tr> <td align="center" > <h3><span>※LTableName※</span></h3><br /> </td></tr>※NewLine※
<tr><td> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" ※NewLine※
AllowSorting="True" BackColor="White" BorderColor="#336666" ※NewLine※
BorderStyle="Double" BorderWidth="3px" CellPadding="4" DataKeyNames="※PrimaryKey※" OnRowUpdating="GridView1_RowAdding"※NewLine※
DataSourceID="SqlDataSource1" GridLines="Horizontal" ※NewLine※
AutoGenerateColumns="False">※NewLine※
<RowStyle BackColor="White" ForeColor="#333333" />※NewLine※
<Columns>※NewLine※
<asp:CommandField ShowSelectButton="True" />※NewLine※
<asp:BoundField DataField="※PrimaryKey※" HeaderText="※PrimaryKey※" ReadOnly="True" Visible="false"※NewLine※
SortExpression="※PrimaryKey※" />※NewLine※
※BoundFields※※NewLine※
</Columns>※NewLine※
<FooterStyle BackColor="White" ForeColor="#333333" />※NewLine※
<PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />※NewLine※
<SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />※NewLine※
<HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" />※NewLine※
</asp:GridView></td></tr>※NewLine※
<tr><td style="width:100%" align="center">※NewLine※
<asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True" ※NewLine※
AutoGenerateRows="False" DataKeyNames="※PrimaryKey※" DataSourceID="SqlDataSource" ※NewLine※
Height="50px" Width="100%" BackColor="White" BorderColor="#336666" ※NewLine※
BorderStyle="Double" BorderWidth="3px" CellPadding="4" ※NewLine※
GridLines="Horizontal" onitemupdated="DetailsView1_ItemUpdated" ※NewLine※
onitemdeleted="DetailsView1_ItemDeleted" ※NewLine※
oniteminserted="DetailsView1_ItemInserted">※NewLine※
<FooterStyle BackColor="White" ForeColor="#333333" />※NewLine※
<RowStyle BackColor="White" ForeColor="#333333" />※NewLine※
<PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />※NewLine※
<Fields>※NewLine※
<asp:BoundField DataField="※PrimaryKey※" HeaderText="※PrimaryKey※" ReadOnly="True" ※NewLine※
SortExpression="※PrimaryKey※" />※NewLine※
※BoundFields※※NewLine※
<asp:TemplateField ShowHeader="False">※NewLine※
<EditItemTemplate>※NewLine※
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" ※NewLine※
CommandName="Update" Text="更新"></asp:LinkButton>※NewLine※
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" ※NewLine※
CommandName="Cancel" Text="取消"></asp:LinkButton>※NewLine※
</EditItemTemplate>※NewLine※
<InsertItemTemplate>※NewLine※
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" ※NewLine※
CommandName="Insert" Text="插入"></asp:LinkButton>※NewLine※
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" ※NewLine※
CommandName="Cancel" Text="取消"></asp:LinkButton>※NewLine※
</InsertItemTemplate>※NewLine※
<ItemTemplate>※NewLine※
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" ※NewLine※
CommandName="Edit" Text="编辑"></asp:LinkButton>※NewLine※
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" ※NewLine※
CommandName="New" Text="新建"></asp:LinkButton>※NewLine※
<asp:LinkButton ID="LinkButton3" runat="server" CausesValidation="False" OnClientClick=" javascript:return confirm('你确认要删除吗?')" ※NewLine※
CommandName="Delete" Text="删除"></asp:LinkButton>※NewLine※
</ItemTemplate>※NewLine※
</asp:TemplateField>※NewLine※
</Fields>※NewLine※
<HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" />※NewLine※
<EditRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />※NewLine※
</asp:DetailsView></td></tr> ※NewLine※
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ※NewLine※
ConnectionString="<%$ ConnectionStrings:※ConnectionStrings※ %>" ※NewLine※
SelectCommand="※SelectCommand※">※NewLine※
</asp:SqlDataSource>※NewLine※
<asp:SqlDataSource ID="SqlDataSource" runat="server" ※NewLine※
ConflictDetection="CompareAllValues" ※NewLine※
ConnectionString="<%$ ConnectionStrings:※ConnectionStrings※ %>" ※NewLine※
DeleteCommand="DELETE FROM [※TableName※] WHERE [※PrimaryKey※] = @original_ID " ※NewLine※
InsertCommand="INSERT INTO [※TableName※] ※InsertCommand※" ※NewLine※
OldValuesParameterFormatString="original_{0}" ※NewLine※
SelectCommand="※SelectCommand※ WHERE [※PrimaryKey※] = @original_ID " ※NewLine※
※NewLine※
UpdateCommand="UPDATE [※TableName※] SET ※UpdateCommand※ WHERE [※PrimaryKey※] = @original_ID ">※NewLine※
<SelectParameters>※NewLine※
<asp:ControlParameter ControlID="GridView1" Name="original_ID" ※NewLine※
PropertyName="SelectedValue" />※NewLine※
</SelectParameters>※NewLine※
<DeleteParameters>※NewLine※
<asp:Parameter Name="original_ID" Type="※PrimaryKey_Type※" />※NewLine※
</DeleteParameters>※NewLine※
<UpdateParameters>※NewLine※
※CommandParameters※※NewLine※
<asp:Parameter Name="original_ID" Type="※PrimaryKey_Type※" />※NewLine※
</UpdateParameters>※NewLine※
<InsertParameters>※NewLine※
<asp:Parameter Name="※PrimaryKey※" Type="※PrimaryKey_Type※" />※NewLine※
※CommandParameters※※NewLine※
</InsertParameters>※NewLine※
</asp:SqlDataSource>※NewLine※
</table>※NewLine※
</div>※NewLine※
</form>※NewLine※
</body>※NewLine※
</html>※NewLine※

2.需要额外加一个字典表,因为这种表名生成类名生成的页面标题和节点名称,用户根本看不明白,需要做映射。
3.根据用户表把数据权限也生成了。甚至可以精确到某个字段加上C、R、U、D组合都生成唯一的主键,再把用户ID放进来,就可以实现超灵活的权限管理了。
4.现根据表名把树菜单节点加上。
代码<asp:TreeNode NavigateUrl='~/View/Base/CGD_DDH_BZ.aspx' Text='CGD_DDH_BZ' Target='HanZiMainPage' Value='CGD_DDH_BZ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CKGL_FL.aspx' Text='CKGL_FL' Target='HanZiMainPage' Value='CKGL_FL'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CKGL_FZ.aspx' Text='CKGL_FZ' Target='HanZiMainPage' Value='CKGL_FZ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CKGL_FZ_BZ.aspx' Text='CKGL_FZ_BZ' Target='HanZiMainPage' Value='CKGL_FZ_BZ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CKGL_WP.aspx' Text='CKGL_WP' Target='HanZiMainPage' Value='CKGL_WP'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CMLB.aspx' Text='CMLB' Target='HanZiMainPage' Value='CMLB'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/DDefault.aspx' Text='DDefault' Target='HanZiMainPage' Value='DDefault'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/DDGL.aspx' Text='DDGL' Target='HanZiMainPage' Value='DDGL'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/DDXX.aspx' Text='DDXX' Target='HanZiMainPage' Value='DDXX'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/DDXX_BZ.aspx' Text='DDXX_BZ' Target='HanZiMainPage' Value='DDXX_BZ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/FKD.aspx' Text='FKD' Target='HanZiMainPage' Value='FKD'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/FLDW.aspx' Text='FLDW' Target='HanZiMainPage' Value='FLDW'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/GYS.aspx' Text='GYS' Target='HanZiMainPage' Value='GYS'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/JGCJ.aspx' Text='JGCJ' Target='HanZiMainPage' Value='JGCJ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/KHXX.aspx' Text='KHXX' Target='HanZiMainPage' Value='KHXX'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/KSFL.aspx' Text='KSFL' Target='HanZiMainPage' Value='KSFL'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/LAST_JG.aspx' Text='LAST_JG' Target='HanZiMainPage' Value='LAST_JG'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/Pass.aspx' Text='Pass' Target='HanZiMainPage' Value='Pass'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/SCGL.aspx' Text='SCGL' Target='HanZiMainPage' Value='SCGL'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/SCGL_MX.aspx' Text='SCGL_MX' Target='HanZiMainPage' Value='SCGL_MX'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/SKD.aspx' Text='SKD' Target='HanZiMainPage' Value='SKD'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/SPGG.aspx' Text='SPGG' Target='HanZiMainPage' Value='SPGG'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/SPLB.aspx' Text='SPLB' Target='HanZiMainPage' Value='SPLB'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/StyleInfo.aspx' Text='StyleInfo' Target='HanZiMainPage' Value='StyleInfo'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/THD.aspx' Text='THD' Target='HanZiMainPage' Value='THD'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/THD_BZ.aspx' Text='THD_BZ' Target='HanZiMainPage' Value='THD_BZ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/THXX.aspx' Text='THXX' Target='HanZiMainPage' Value='THXX'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/XSD.aspx' Text='XSD' Target='HanZiMainPage' Value='XSD'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/XSXX.aspx' Text='XSXX' Target='HanZiMainPage' Value='XSXX'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/XSXX_BZ.aspx' Text='XSXX_BZ' Target='HanZiMainPage' Value='XSXX_BZ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/YGZL.aspx' Text='YGZL' Target='HanZiMainPage' Value='YGZL'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/YSLB.aspx' Text='YSLB' Target='HanZiMainPage' Value='YSLB'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/ZYZGL.aspx' Text='ZYZGL' Target='HanZiMainPage' Value='ZYZGL'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/UserRight.aspx' Text='UserRight' Target='HanZiMainPage' Value='UserRight'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/UserLogin.aspx' Text='UserLogin' Target='HanZiMainPage' Value='UserLogin'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/UserInfo.aspx' Text='UserInfo' Target='HanZiMainPage' Value='UserInfo'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/GongGao.aspx' Text='GongGao' Target='HanZiMainPage' Value='GongGao'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CGD.aspx' Text='CGD' Target='HanZiMainPage' Value='CGD'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CGD_BZ.aspx' Text='CGD_BZ' Target='HanZiMainPage' Value='CGD_BZ'></asp:TreeNode>
<asp:TreeNode NavigateUrl='~/View/Base/CGD_DDH.aspx' Text='CGD_DDH' Target='HanZiMainPage' Value='CGD_DDH'></asp:TreeNode>
</asp:TreeNode>
如图。

6.框架页.
代码
扩展延伸:
这样利用.net的标准控件,很简单把PD,ERWin,Rose任何一个建模工具绘出来图直接生成所见所得的简单的框架,优点是对微型小项目,效率高,对有复杂的业务逻辑要求较高的不适用。
很久没写技术博客了,这个看真不习惯了。这个小项目还没做完,把 我思路拿出来晒晒,上面SQL代码和Html代码可能有敏感字符,展不开,晕死,有任何意见或对代码感兴趣的可以留下邮件地址,共同学习:)


浙公网安备 33010602011771号