表单控件的副产品——查询控件

查询控件

温故而知新
能自己“跑”的表单控件,思路,雏形,源码。vs2005版本

表单控件续(1)——应用接口来简化和分散代码

    当初在写表单控件的时候,突然想到,这个表单控件稍微修改一下不就是一个查询控件了吗?

    那么查询控件需要做的什么事情呢?
         1、自己描绘控件,比如能够自己添加文本框、下拉列表框这一类的控件。
         2、可以自己获取用户输入的信息,根据查询方式组合where 后面的 SQL语句 。

    是不是和表单控件很像呢?

    在表单控件的SaveData()里面我们可以得到字段名称和对应的用户输入的信息,那么我们就可以写成这种方式。
        for (int i = 0; i < info.Length; i++)
            {

                iCntl = this.FindControl("c_" + info[i].ColSysName) as IGetControlValue;
                if (iCntl != null)
                    query = ColSysName + "like '%" + iCntl.GetControlValue() + "%'";
     
            }

    当然并不是所有的查询都是只用 like 就可以搞定的,这里需要一个查询方式的属性,于是我们可以扩展一下ControlInfos 加一个属性(FindKind),用来记录查询方式。

    然后根据这个属性,我们就可以来组合SQL语句了,准确的说是where 后面的SQL语句。目前的方法还是需要使用case 。

string str = iCntl.GetControlValue()
switch ( infos[i].FindKind)
            {
                case 1:
                    if (DoubleType.FromString(inputInfo[i]) != 0.0)
                    {
                        str2 = " [" + info[i].ColSysName + "]=" + str;
                    }
                    goto Label_0615;

                case 2:
                    str2 = " [" + info[i].ColSysName + "]='" + str + "'";
                    goto Label_0615;

                case 3:
                    str2 = " [" + info[i].ColSysName + "] like '%" + str + "%'";
                    goto Label_0615;

                case 4:
                    str2 = " [" + info[i].ColSysName + "] like '" + str + "%'";
                    goto Label_0615;

                case 5:
                    str2 = " [" + info[i].ColSysName + "] like '%" + str + "'";
                    goto Label_0615;

                case 6:
                    str2 = " [" + info[i].ColSysName + "] like '" + str + "'";
                    goto Label_0615;

                case 11:
                    str2 = " [" + info[i].ColSysName + "]>'" + str + "'";
                    goto Label_0615;

                case 12:
                    str2 = " [" + info[i].ColSysName + "]<'" +str + "'";
                    goto Label_0615;

                case 13:
                    str2 = " [" + info[i].ColSysName + "]>='" +str + "'";
                    goto Label_0615;

                case 14:
                    str2 = " [" + info[i].ColSysName + "]<='" + str + "'";
                    goto Label_0615;

                case 0x15:
                    strArray3 = inputInfo[i].Split(new char[] { '|' });
                    if (strArray3[0].Length != 0)
                    {
                        goto Label_04B1;
                    }
                    str2 = "";
                    goto Label_0615;

                case 0x16:
                    strArray2 = inputInfo[i].Split(new char[] { '|' });
                    if (strArray2[0].Length != 0)
                    {
                        break;
                    }
                    str2 = "";
                    goto Label_0615;

                case 0x17:
                    str3 = inputInfo[i].Replace("|", ",");
                    if (str3.Length != 0)
                    {
                        goto Label_0549;
                    }
                    str2 = "";
                    goto Label_0615;

                case 0x18:
                    str4 = inputInfo[i].Replace(",", "','").Replace("|", "','");
                    if (str4.Length != 0)
                    {
                        goto Label_05CA;
                    }
                    str2 = "";
                    goto Label_0615;

                case 30:
                    str2 = "";
                    goto Label_0615;

                default:
                    goto Label_0615;
            }

不好意思,原来使用vb.net来写的,这个是用Reflector反编译的,不知道为什么还给弄出来goto了。看来我写的代码不用混淆也可以了,我自己都看不懂了。还是发一个“原版”的吧。

 Private Sub btn_click()Sub btn_click(ByVal Sender As Object, ByVal E As EventArgs)
        'MyBase.Context.Response.Write("内部事件<BR>")
        Dim colInfo() As ColumnsInfo = _Col.SetColumnsInfos()
        Dim inputInfo() As String = _Col.GetInputInfo

        If inputInfo Is Nothing Then
            System.Web.HttpContext.Current.Response.Write("_") '没有输入,或者输入有误!
            Return
        End If

        '调用外部事件——查询前
        OnBtnClick(Sender, E)


        '字段的查询方式。1:= int;2:=string; 3:like %n%;  4:like n%; 5:like %n ;6:like n;11:> string;12:< string;13:>= string;14: <= string
        Dim find As String = ""
        Dim tmp As String = ""
        Dim i As Int32
        For i = 0 To colInfo.Length - 1
            If inputInfo(i).Length > 0 And inputInfo(i) <> "-999999" And inputInfo(i) <> "_n_" Then
                '输入了信息,组成查询条件
                Select Case colInfo(i).SearchKind
                    Case 1      '= int
                        If inputInfo(i) <> 0 Then
                            tmp = " [" & colInfo(i).ColSysName & "]=" & inputInfo(i)
                        End If
                    Case 2      '= string
                        tmp = " [" & colInfo(i).ColSysName & "]='" & inputInfo(i) & "'"
                    Case 3      'like %n%
                        tmp = " [" & colInfo(i).ColSysName & "] like '%" & inputInfo(i) & "%'"
                    Case 4      'like n%
                        tmp = " [" & colInfo(i).ColSysName & "] like '" & inputInfo(i) & "%'"
                    Case 5      'like %n
                        tmp = " [" & colInfo(i).ColSysName & "] like '%" & inputInfo(i) & "'"
                    Case 6      'like n
                        tmp = " [" & colInfo(i).ColSysName & "] like '" & inputInfo(i) & "'"
                    Case 11      '> string
                        tmp = " [" & colInfo(i).ColSysName & "]>'" & inputInfo(i) & "'"
                    Case 12      '< string
                        tmp = " [" & colInfo(i).ColSysName & "]<'" & inputInfo(i) & "'"
                    Case 13      '>= string
                        tmp = " [" & colInfo(i).ColSysName & "]>='" & inputInfo(i) & "'"
                    Case 14      '<= string
                        tmp = " [" & colInfo(i).ColSysName & "]<='" & inputInfo(i) & "'"
                    Case 22      'between int
                        Dim aa() As String = inputInfo(i).Split("|")
                        If aa(0).Length = 0 Then
                            tmp = ""
                        Else
                            If aa(1).Length = 0 Then
                                aa(1) = aa(0)
                            End If
                            tmp = " [" & colInfo(i).ColSysName & "] between " & aa(0) & " and " & aa(1)
                        End If
                    Case 21      'between string
                        Dim aa() As String = inputInfo(i).Split("|")
                        If aa(0).Length = 0 Then
                            tmp = ""
                        Else
                            If aa(1).Length = 0 Then
                                aa(1) = aa(0)
                            End If
                            tmp = " [" & colInfo(i).ColSysName & "] between '" & aa(0) & "' and '" & aa(1) & "'"
                        End If

                    Case 23     'col in () 多选查询 数字方式
                        Dim a23 As String = inputInfo(i).Replace("|", ",")
                        'System.Web.HttpContext.Current.Response.Write(a23)
                        If a23.Length = 0 Then
                            tmp = ""
                        Else
                            tmp = " [" & colInfo(i).ColSysName & "] in (" & a23 & ")"
                        End If

                    Case 24     'col in () 多选查询 字符串方式
                        Dim a23 As String = inputInfo(i).Replace(",", "','")
                        a23 = a23.Replace("|", "','")
                        'System.Web.HttpContext.Current.Response.Write(a23)
                        If a23.Length = 0 Then
                            tmp = ""
                        Else
                            tmp = " [" & colInfo(i).ColSysName & "] in ('" & a23 & "')"
                        End If

                    Case 30     '不生成查询条件
                        tmp = ""

                End Select

                '加到查询条件里面
                If tmp.Length > 0 Then
                    If find.Length > 0 Then
                        find &= " and " & tmp
                    Else
                        find = tmp
                    End If
                End If

            End If
            tmp = ""
        Next

        If _OutSearch.Length > 0 Then
            '有外部的查询条件,加到 find 里面
            If find.Length > 0 Then
                find = find & " and " & _OutSearch
            Else
                find = _OutSearch
            End If
        End If

        'System.Web.HttpContext.Current.Response.Write(find)
        If Not _PageTurn Is Nothing Then
            If _PageTurn.SetQuery.Length = 0 Then
                _PageTurn.SqlQuery = find
            Else
                If find.Length = 0 Then
                    _PageTurn.SqlQuery = _PageTurn.SetQuery
                Else
                    _PageTurn.SqlQuery = _PageTurn.SetQuery & " and " & find
                End If

            End If

            _Search = find
            _PageTurn.SqlQuery = find
            _PageTurn.CreateQuery()
            _PageTurn.BindFirstPage()

        End If

       
    End Sub
#End Region

    当然这里有一个适用范围和习惯的问题。我是习惯使用DataTable来装载数据,而填充 DataTable 需要SQL语句,那么我只需要得到 where 后面的部分,查询的功能就可以实现了,所以对于我来说,查询控件能够输出像 "myName like '%jyk%'" 这样的字符串就已经够用了。

    还记得分页控件吗?分页控件有一个属性:myPage.SqlQuery = "";这个属性就是用来给分页控件设置查询条件的,正好可以查询控件对应上,这两个控件一配合起来,查询、分页就变得非常的简单了。

    对其他的查询方式的支持的考虑    
    我没有用过使用实体类来显示数据的方式,所以也不知道对于实体类来说,查询是怎么做的,不过这个查询控件至少可以提供字段名和对应的值,应该是可以用得上的吧。

    可能有些人喜欢使用存储过程来返回记录,查询条件也会写在存储过程里面,那么在调用存储过程的时候需要传递存储过程的参数,这种情况,查询控件也可以帮上点忙吧。

    抽象
    这样出现了一个问题,由于两个控件比较象,但是总不能等表单控件写好了,然后复制粘贴,再改一改,查询控件就诞生了吧。我们是不是应该对于相同的地方进行“抽象”呢,把相同的代码放在基类里面。可能你会说,就两种情况,有必要抽象吗,还弄一个基类出来是不是多此一举呢?我的回答是:很有必要。除非这两个控件件写完了之后就再也不需要修改了。

    只是单独写很好写,不用顾忌其他,但是要考虑到其他的用法的话,那就要十分小心了。

 

时间: 2024-09-20 06:02:17

表单控件的副产品——查询控件的相关文章

Extjs form 表单添加已有的软键盘控件

问题描述 Extjs form 表单添加已有的软键盘控件 现在那两个输入框都是普通的输入框. 我想换成带 软键盘控件的输入框. 我的软键盘输入框是单独的js. 在页面是只要加入 writeEditObject("safeedit",{"entertype":"edit","width":170,"height":24,"accepts":"[:print:]+",&q

[译]更好的表单设计: 每一页,一件事(实例研究)

本文讲的是[译]更好的表单设计: 每一页,一件事(实例研究), 原文地址:Better Form Design: One Thing Per Page (Case Study) 原文作者:Adam Silver 译文出自:掘金翻译计划 译者:horizon13th 校对者:LeviDing, laiyun90 更好的表单设计: 每一页,一件事(实例研究) 2008 年,我在 Boots.com 工作时,团队提出需求,要设计当时最流行的单页表单进行付款操作,主要技术有折叠选项卡,AJAX,客户端验

validator-Validator验证表单,jqueryUI spinner控件值无法验证通过的

问题描述 Validator验证表单,jqueryUI spinner控件值无法验证通过的 在表单中试用了jqueryUI中的spinner ,表单使用jquery插件 formvalidate验证.当提交表单时会验证,在验证失败的控件上显示红叉.而当再次输入正确的值时该红叉会变为对号.在spinner中写值,直接提交空表.spinner控件上报红叉,该空间验证了不为空.可当通过spinner上的按钮给spinner赋值,spinner的验证还是失败.必须手写输入才行. 验证失败后点击spinn

Step By Step 一步一步写网站[1] —— 帧间压缩,表单控件

记得在大学的时候,学习多媒体遇到了一个概念:帧内压缩和帧间压缩.我感觉我的第一篇里里面提到的我的那个方法有一点像帧间压缩,那么是不是把代码减少到极致了呢? 单看一个表的添加代码好像是,但是一个项目可不是只有一个添加的页面就完事了,项目越大,添加的页面也就越多,每个页面都写这么多的代码,依然很烦.那么怎么办呢? 许多人想到了代码生成器.是的,代码生成器可以减少我们的劳动,但是不能减少代码! 相反,由于使用了代码生成器,限制了我们的想象力,让我们居于现状,认为这么多的代码是正常的,是不可避免的,反正

JS中artdialog弹出框控件之提交表单思路详解_javascript技巧

artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口. 前言: 自适应内容 artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适应,因此你不必去考虑消息内容尺寸使用它.它的消息容器甚至能够根据宽度让文本居中或居左对齐--这一切全是XHTML+CSS原生实现. 完善的接口 它的接口完善,可以轻易与外部程序配合使用.如异步写入消息.控制位置.尺寸.显示与隐藏.关闭等. 细致的体验 如果不是在输入状态,它支持Esc快捷键关

基类、接口的应用——表单控件:一次添加、修改一条记录,一次修改多条记录。(上)

好久没发帖子了,又加了不少的功能呀.(图片仅是测试,不代表什么表情.) 本来我也想写一个2007的总结的,但是看到很多人都写了,我就不凑热闹了,写点和代码有关系的吧. 写作原因: 1.在项目里做得最多的操作恐怕就是保存数据了,总是要写一大堆的代码,能不能简单一点呢?2005来了,似乎可以减少一些代码,但是03里怎么办呢? 2.基类.接口.策略模式,好多高手都讨论过了,但是都是理论上的,在实践中如何应用呢?在webform 里面又怎么使用呢? 目的: 1.做一个"控件"来应对各种表单的录

看实例学VFP:模拟VB控件数组操作标签控件

VB中有控件数组,使用它可以批量设置控件的属性,这个东西最直接的作用就是可以简化代码.今天我们在vfp中模拟VB控件数组,操作vfp中最基本的控件之一:标签控件(label).在vfp基础教程-标签控件(label)一文中对该控件的属性及用途等已经有比较详尽地描述,关于它实在是没有什么好说的了. 本文设计的这个例子是这样的:在表单激活时(Activate事件),采用类似vb控件数组的处理方式在循环语句中为各个标签设置属性,如下图1:在命令按钮的click事件中,通过单击将5个标签的caption

FrontPage基础教程 表单的设计

frontpage|基础教程|设计 表单在网站的制作过程中是比较常见的,举个简单的例子,我们在申请免费电子信箱或者个人主页时,需要填写一些个人信息,比如用户名.口令.密码提示信息等,收集这些信息的工具就是表单.常用表单的类型包括联系信息表单.请求表单.发货和付费方式的订购表单.反馈表单.搜索查询表单等. 制作搜索表单 对访问者来说,在一个大网站中查找文章会很不方便,这时我们可以创建一个搜索表单.执行"插入/Web组件"命令,打开"插入Web组件"对话框.在左侧窗口中

FrontPage XP表单的设计

frontpage|设计 表单在网站的制作过程中是比较常见的,举个简单的例子,我们在申请免费电子信箱或者个人主页时,需要填写一些个人信息,比如用户名.口令.密码提示信息等,收集这些信息的工具就是表单.常用表单的类型包括联系信息表单.请求表单.发货和付费方式的订购表单.反馈表单.搜索查询表单等. 制作搜索表单 对访问者来说,在一个大网站中查找文章会很不方便,这时我们可以创建一个搜索表单.执行"插入/Web组件"命令,打开"插入Web组件"对话框.在左侧窗口中选择&qu