zoukankan      html  css  js  c++  java
  • 基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)

    好久没发帖子了,又加了不少的功能呀。(图片仅是测试,不代表什么表情。)

    本来我也想写一个2007的总结的,但是看到很多人都写了,我就不凑热闹了,写点和代码有关系的吧。

    写作原因:
    1、在项目里做得最多的操作恐怕就是保存数据了,总是要写一大堆的代码,能不能简单一点呢?2005来了,似乎可以减少一些代码,但是03里怎么办呢?
    2、基类、接口、策略模式,好多高手都讨论过了,但是都是理论上的,在实践中如何应用呢?在webform 里面又怎么使用呢?

    目的:
    1、做一个“控件”来应对各种表单的录入,包括一次保存一条记录、一次保存多条记录。
    2、写一下我对基类、接口、策略模式的理解,请各位高手批批。通过对一个实际中的例子的讨论,可以让新同学更好的理解吧。

    针对的框架:
    目前只考虑 asp.net1.1  (webform)。

    先贴个图片,就是这样的表单



    [开始了]

    1、取值问题
    表单里会有很多种控件,每一种控件的取值方法又不太一致,有的叫做 “Text”,有的叫做“SelectedValue”,甚至有的还要自己在写几行代码才行(比如 CheckBoxList)。

    那么怎么才能让取值更简单一点呢?我想写一个方法(GetValue)来获取用户输入的数据,而且在取值的时候不必关心是什么控件,一个GetValue,就把值得到了,管它是什么控件呢!

    如果用基类的话就要在控件的“共有”基类里面加一个方法,但是这个“共有”的基类也不是太好找,再有呢在.net框架里加点东东好像也不是太容易(或者是我学艺不精)。

    我想到的解决方法呢就是使用接口。

    先定义一个接口:IGetControlValue
    Public Interface IGetControlValue

        
    ReadOnly Property ControlKind() As String
        
    Function GetControlValue() As String
            
    End Interface

     然后呢再写几个自定义服务器控件(比如文本控件、下拉列表框了什么的),让他们继承这个接口。

    目前我写了五个这样的控件:HBSTextBox 、HBSCheckBox 、HBSCheckBoxList 、HBSDropDownList 、HBSRadioButtonList 
    他们都继承了IGetControlValue。

    控件比较多,我就只贴出 HBSCheckBoxList 的代码吧,其他的都是类似的写法。

    <ToolboxData("<{0}:HBSCheckBoxList runat=server></{0}:HBSCheckBoxList>")> _
     
    Public Class HBSCheckBoxList
        
    Inherits System.Web.UI.WebControls.CheckBoxList
        
    Implements IGetControlValue

    实现接口


    初始化 OnInit。设置CssClass、DataValueField、DataTextField、

        
    '返回选择的ID值,用 , 分隔
    函数实现  GetSelectedValue


    (什么?您问为什么还有一个 GetSelectedValue(),没办法,这个是以前就实现了的,接口是后加的,为了保持向下兼容

     好了取值的问题基本解决了。


    2、寻找控件。

    如果加了接口之后还是 this.Txt1.GetValue(); 或者  ((IGetControlValue)Txt1).GetControlValue();那就没什么意思了。
    我想达到的是  ((IGetControlValue)Page.FindControl("控件ID")).GetControlValue();

    这样做的好处是我只要知道控件的ID就可以得到数据,而不必去关心到底是什么控件,取值上有没有什么特殊的地方。
    另外呢我还可以做一个循环,把控件ID放到一个数组里面,然后循环一下就可以了。控件(字段)再多我也不怕了,代码行数不会跟随字段的增加而增加。


    3、开始保存数据(单条数据)。
    在这里呢建议先看一下我以前发的一个帖子。
    其实添加数据也可以这样简单——表单的第一步抽象(针对数据访问层)《怪怪设计论: 抽象无处不在 》有感

    具体代码如下:

    添加数据

    (自我感觉还是挺简洁的,dal.InsertDataStr("_TestInterface",str1,str); 是调用数据访问层里的函数,而这个“数据访问层”是通用的,已经编译成dll,可以随时调用)。


    4、保存多条数据。

    上面说的是一次保存一条数据,那么要一次保存多条怎么办呢?这里需要DataGrid来帮忙了。
    拖一个DataGrid出来,然后做一下设置,加几个模版类。


    然后呢保存代码如下:

    一次修改多条数据

    这里保存了五个字段的记录,怎么样代码不是太多吧。
    最大的优点就是:当控件在DataGrid的列的位置发生变化的时候,修改是很方便的。

    什么?您问取值的地方在哪里?已经被我封装起来了。
    form.SaveDataByDataGrid 是一个 针对DataGrid 来说通用的方法,只要你是用DataGrid来“绘制”页面的话就可以使用这个方法,不必每次(或每个项目)都写一遍。


    还是贴一下  SaveDataByDataGrid 的代码吧。

    Public Class FormTableSaveData

        
    Public dal As DataAccessLayer           '数据访问层
        Public TableName As String = ""         '添加、修改用的表名


    保存DataGrid里的全部数据

    保存DataGrid里的一条数据


    End Class

    这样就基本OK了。今天刚刚写好,可能会有一些错误,另外还有一个问题没有说,还有几个延伸的地方。放在下集在说吧。

    (上集完成)

  • 相关阅读:
    什么是模板缓冲(Stencil Buffer)
    linux的source命令
    设置屏幕不被锁屏
    【转】OpenGL ES EGL & TLS(线程局部存储) & G3D
    [转]OpenGL混色介绍
    【转】Android 启动过程汇总
    Analyzing the memory usage of your Android application
    【转】EGL接口介绍(转)
    Android 核心分析(13) Android GWES之Android窗口治理
    /dev/zero和/dev/null的区别
  • 原文地址:https://www.cnblogs.com/jyk/p/1021070.html
Copyright © 2011-2022 走看看