zoukankan      html  css  js  c++  java
  • Asp.net Webform 数据源绑定控件的扩展(懒人的办法):DropDownList

    1.  开篇的废话
    2.  实现的功能
    3.  源代码
    4.  小结

     开篇的废话

    在北京回老家已经一年了,今天入职第七天。工作已近有一个多星期了,还是做老本行,码农!虽然跟正式码农的日子告别有一段时间了,但是小菜的技术始终没放下。谈谈入职后的感觉,公司所有员工加起来都40+的人吧。在我们这个不入流的小城市里面算是不小的私人企业,置于我们的开发部,算上经理也有9个人了。但是公司的技术,小菜实在不敢苟同。基本上可以这么说,做Page胡乱的设置CSS,然后拖控件,双击写代码,各种问题。Try Catch漫天飞,Sql语句是+出来的。测试昨天刚测了一个项目,120多个Bug。在并不复杂的业务流程、十几个小功能、3个登陆角色的系统里面,可以算是惊人了。测试对我说,我这还没有写测试用例,手点出来的。公司是用Asp.net Webform做开发的,vs2008 framework3.5,面对着公司的老员工我不知道说什么好,也能说什么。就连一个Bing的DropDownList都是在Page_Load里面去读取DataTable,然后DataTable.NewRow(),添加空选项,Bing到DropDownList。难道说,前辈们用了这么多年,都没写烦了?这也是我今天写这个博文的主要原因。既然公司不让用MVC,不要技术只要效果,不要质量只要能用,那么,小菜在这里来封装自己的套Webform Control.也许Control不支持Ajax,但是再也不会因为,赋值,因为Binding,因为pager,因为回传,因为搜索,而产生120+的Bug。

     实现的功能

    Page Code
    1  <Binarysoft:ComboBox ID="ComboBox1" TableName="RBAC_Objects" DataTextField="ObjectName" DataValueField="PKey" DefaultText="选中信息" SortName="ObjectOrderBy" runat="server">
    2     </Binarysoft:ComboBox>

    效果图:

    支持 ConnectionName 指定连接字符串名称,支持DefaultText,是否添加非数据表内的默认选项(如果为设置 DefaultText则无默认选项),支持Where字段,支持表或者视图。支持SortName排序字段,支持对IExecuteable接口的支持。如果ConnectionName为空则使用Page的IExecuteable进行数据操作,如果没有ConnectionName 和 为实现Iexecuteable 则不检索数据。注意,只需要在Page中加入如下标记,无需后台Binding即可实现DropDownList的数据绑定。支持ISPostBack的状态区分。

      源代码

      1  [DefaultProperty("Text")]
      2     [ToolboxData("<Binarysoft:ComboBox runat=server></Binarysoft:ComboBox>")]
      3     public class ComboBox : DropDownList
      4     {
      5         private Database DataAccess;
      6 
      7         [Bindable(true)]
      8         [Category("Appearance")]
      9         [DefaultValue("")]
     10         [Localizable(true)]
     11         public string TableName
     12         {
     13             get
     14             {
     15                 String s = (String)ViewState["TableName"];
     16                 return ((s == null) ? String.Empty : s);
     17             }
     18 
     19             set
     20             {
     21                 ViewState["TableName"] = value;
     22             }
     23         }
     24 
     25         [Bindable(true)]
     26         [Category("Appearance")]
     27         [DefaultValue("")]
     28         [Localizable(true)]
     29         public string ConnectionName
     30         {
     31             get
     32             {
     33                 String s = (String)ViewState["ConnectionName"];
     34                 return ((s == null) ? String.Empty : s);
     35             }
     36 
     37             set
     38             {
     39                 ViewState["ConnectionName"] = value;
     40             }
     41         }
     42 
     43         [Bindable(true)]
     44         [Category("Appearance")]
     45         [DefaultValue("")]
     46         [Localizable(true)]
     47         public string DefaultText
     48         {
     49             get
     50             {
     51                 String s = (String)ViewState["DefaultText"];
     52                 return ((s == null) ? String.Empty : s);
     53             }
     54 
     55             set
     56             {
     57                 ViewState["DefaultText"] = value;
     58             }
     59         }
     60 
     61         [Bindable(true)]
     62         [Category("Appearance")]
     63         [DefaultValue("")]
     64         [Localizable(true)]
     65         public string Where
     66         {
     67             get
     68             {
     69                 String s = (String)ViewState["Where"];
     70                 return ((s == null) ? "1=1" : s);
     71             }
     72 
     73             set
     74             {
     75                 ViewState["Where"] = value;
     76             }
     77         }
     78 
     79         [Bindable(true)]
     80         [Category("Appearance")]
     81         [DefaultValue("")]
     82         [Localizable(true)]
     83         public string SortName
     84         {
     85             get
     86             {
     87                 String s = (String)ViewState["SortName"];
     88                 return ((s == null) ? this.DataTextField : s);
     89             }
     90 
     91             set
     92             {
     93                 ViewState["SortName"] = value;
     94             }
     95         }
     96 
     97         protected override void OnDataBinding(EventArgs e)
     98         {
     99             if (!string.IsNullOrEmpty(DataTextField) && !string.IsNullOrEmpty(DataTextField) && !string.IsNullOrEmpty(TableName))
    100             {
    101                 DataAccess = string.IsNullOrEmpty(ConnectionName) ?
    102                     (this.Page as Binarysoft.Library.Webform.UI.Page).DataAccess :
    103                     DatabaseFactory.CreateDatabase(ConnectionName);
    104                 this.DataSource = DataAccess.ExecuteDataTable(string.Format("SELECT {0},{1} FROM {2} WHERE {3} ORDER BY {4}", DataTextField, DataValueField, TableName, Where, SortName));
    105             }
    106             base.OnDataBinding(e);
    107         }
    108 
    109         protected override void OnDataBound(EventArgs e)
    110         {
    111             base.OnDataBound(e);
    112             if (!string.IsNullOrEmpty(DefaultText))
    113             {
    114                 ListItem defaultItem = new ListItem();
    115                 defaultItem.Value = string.Empty;
    116                 defaultItem.Text = DefaultText;
    117                 this.Items.Insert(0, defaultItem);
    118             }
    119         }
    120 
    121         protected override void OnPagePreLoad(object sender, EventArgs e)
    122         {
    123             if (!Page.IsPostBack)
    124             {
    125                 this.DataBind();
    126             }
    127             base.OnPagePreLoad(sender, e);
    128         }
    129 
    130         protected override void OnLoad(EventArgs e)
    131         {
    132             base.OnLoad(e);
    133         }
    134     }

      小结

    This may not be the best, but I try to, this is just the beginning ...

    博客不易,转载请注明出处。Binarysoft.
  • 相关阅读:
    angular ng-bind-html异常Attempting to use an unsafe value in a safe context处理
    JS执行机制详解,定时器时间间隔的真正含义
    es6入门4--promise详解
    es6入门3--箭头函数与形参等属性的拓展
    JS判断滚动条到底部,页面是否有滚动条
    js forEach跳出循环
    es6入门2--对象解构赋值
    前端开发与日常好玩的的小工具,网站与插件分享
    详解 线程池
    详解 volatile关键字 与 CAS算法
  • 原文地址:https://www.cnblogs.com/BinaryBoy/p/2964178.html
Copyright © 2011-2022 走看看