机房重构--组合查询

来源:互联网 发布:淘宝达人模拟帖子 编辑:程序博客网 时间:2024/05/01 04:52

    从5月6号开始敲组合查询,苦恼了三天,今天终于出形了!刚开始Bug满天飞,改了N遍,现在终于可以大概可以运行了,不管做的好不好得先自己做出来一份再说话,所以记录一下!后边完善优化后还会更新!


    一、大概说说我的思路:

    组合查询我用的模板方法和存储过程,三个组合查询其实都差不多,所以先建一个父窗体,然后让那三个子窗体继承父窗体,子窗体只用写UI层即可。
我的思路:
    1、窗体加载事件:
   (1)、DateTimePicker控件不可见
   (2)、在加载的时候,只有第一行控件可用,后两行不可用
   (3)、当选中DataGridView控件就选中行
    2、清空按钮的单击事件:所有信息清空
 
    3、查询按钮的单击事件:
   (1)、定义一个用于接收“要查询的内容”的变量
          注意:这里之所以定义一个变量是因为“要查询的内容”这里包括两个部分(文本框和日期时间控件)
   (2)判断当第一个“组合关系”为空时:
    a、如果字段名选择的是日期:文本框(txtContent1)不可见,时间控件(dtp1)可见,然后把选择的日期赋给txt1,最后判第一行控件有没有空的
    b如果选择的非日期:时间控件(dtp1)不可见,文本框(txtContent1)可见,把txtContent1的值赋给txt1
  (3)、第一个“组合关系”不为空时:(和判断当第一个“组合关系”为空时相似,这里就不说了)
         我把第三行组合控件的相关判断放在了Else后面,具体如下代码
  (4)、给实体赋值
  (5)、给外观层传参


    4、组合关系(cmbRelation)的SelectedIndexChanged事件:
       当哪个组合关系的内容发生改变时,把下一行的查询框设置成可用
    5、字段名(cmbField)的SelectedIndexChanged事件:
       如果字段名选择的是日期则日期控件可见,文本框控件不可见
    6、定义虚函数
    7、显示DataGridView


     二、简单说几个困扰过我的问题:

     1、问题:日期传值,刚开始我用的Format(dtp1.Value,"yyyy-MM-dd")去传值,结果不是显示空,就是传的现在的日期时间,不是我查询时选择的日期时间,操作符选择“=”就报错

       解决:用“dtp1.Text.ToString()”传值!

            具体请看代码部分

     2、问题:把U层的“要查询的信息”传给实体时,它说“变量在赋值前被使用,可能会在运行时导致Null引用异常”

        解决:没给变量赋初值

    3、问题:SQLHelper老报错,语法的问题

       解决:仔细看看检查存储过程

 

     三、父窗体U层代码:(D层也不展示了,和那些窗体的D层其实没有太大差别)

Public Class frmZuHe    '定义实体      Protected ZuHeInfo As New Entity.ZuHeEntity    '窗体加载      Private Sub frmZuHe_Load(sender As Object, e As EventArgs) Handles MyBase.Load        'DateTimePicker控件的可见性          dtp1.Visible = False        dtp2.Visible = False        dtp3.Visible = False        '在加载的时候,只有第一行控件可用,后两行不可用        cmbField2.Enabled = False        cmbField3.Enabled = False        cmbOperator2.Enabled = False        cmbOperator3.Enabled = False        cmbRelation2.Enabled = False        txtContent2.Enabled = False        txtContent3.Enabled = False        '当选中DataGridView控件就选中行        DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect        Dim i As Integer        For i = 0 To DataGridView1.Columns.Count - 1            DataGridView1.Columns(i).Width = DataGridViewAutoSizeColumnMode.AllCells        Next    End Sub    '查询    Public Sub btnInquiry_Click(sender As Object, e As EventArgs) Handles btnInquiry.Click        '定义一个变量,用于接收文本框或者时间控件传递的内容          Dim txt1 As String = ""        Dim txt2 As String = ""        Dim txt3 As String = ""        '1、第一个组合关系为空        If cmbRelation1.Text = "" Then            If cmbField1.Text = "上机日期" Or cmbField1.Text = "下机日期" Then                dtp1.Format = DateTimePickerFormat.Custom                dtp1.Visible = True                txtContent1.Visible = False                txt1 = dtp1.Text.ToString()            Else                dtp1.Visible = False                txtContent1.Visible = True                txt1 = txtContent1.Text            End If            If cmbField1.Text = "" Or cmbOperator1.Text = "" Or txt1 = "" Then                MsgBox("第一行查询条件不能为空!", , "提示")                Exit Sub            End If        End If        '2、选择了第一个组合关系        If cmbRelation1.Text <> "" Then            If cmbField2.Text = "上机日期" Or cmbField2.Text = "下机日期" Then                dtp2.Format = DateTimePickerFormat.Custom                dtp2.Visible = True                txtContent2.Visible = False                txt2 = dtp2.Text.ToString()            Else                txtContent2.Visible = True                dtp2.Visible = False                txt2 = txtContent2.Text                If cmbField2.Text = "" Or cmbOperator2.Text = "" Or txt2 = "" Then                    MsgBox("第二行查询条件不能为空!", , "提示")                    Exit Sub                End If            End If            '选择了第二个组合关系        Else            If cmbRelation2.Text <> "" Then                If cmbField3.Text = "上机日期" Or cmbField3.Text = "下机日期" Then                    dtp3.Format = DateTimePickerFormat.Custom                    dtp3.Visible = True                    txtContent3.Visible = False                    txt3 = dtp3.Text.ToString()                Else                    txtContent3.Visible = True                    dtp3.Visible = False                    txt3 = txtContent3.Text                End If                If cmbField3.Text = "" Or cmbOperator3.Text = "" Or txt3 = "" Then                    MsgBox("此时所有的信息都要填写,有空的信息没有填写,请检查!", , "提示")                    Exit Sub                End If            End If        End If        '给实体赋值        ZuHeInfo.TableName = GetTable()        '字段名赋值        ZuHeInfo.CmbField1 = GetDBName(cmbField1.Text.Trim())        ZuHeInfo.CmbField2 = GetDBName(cmbField2.Text.Trim())        ZuHeInfo.CmbField3 = GetDBName(cmbField3.Text.Trim())        ZuHeInfo.CmbOperator1 = cmbOperator1.Text.Trim()        ZuHeInfo.CmbOperator2 = cmbOperator2.Text.Trim()        ZuHeInfo.CmbOperator3 = cmbOperator3.Text.Trim()        ZuHeInfo.TxtContent1 = txt1        ZuHeInfo.TxtContent2 = txt2        ZuHeInfo.TxtContent3 = txt3        '组合关系赋值        ZuHeInfo.CmbRelation1 = GetDBName(cmbRelation1.Text.Trim())        ZuHeInfo.CmbRelation2 = GetDBName(cmbRelation2.Text.Trim())        '给外观层方法传递参数        Dim dt As New DataTable        Dim faca As New Facade.ZuHeFacade        dt = faca.CheckZuHe(ZuHeInfo)        If dt.Rows.Count = 0 Then            MsgBox("没有符合查询条件的数据,请重新选择查询条件!", , "提示")            DataGridView1.DataSource = Nothing        Else            Call Todatagridview()        End If    End Sub    '当第一个组合关系的内容发生改变时,把第二行查询框设置成可用    Private Sub cmbRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation1.SelectedIndexChanged        cmbField2.Enabled = True        cmbOperator2.Enabled = True        txtContent2.Enabled = True        cmbRelation2.Enabled = True    End Sub    '当第二个组合关系的内容发生改变时,把第三行查询框设置成可用    Private Sub cmbRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation2.SelectedIndexChanged        cmbField3.Enabled = True        cmbOperator3.Enabled = True        txtContent3.Enabled = True    End Sub    '定义虚函数GetDBName,获取不同数据库的字段名     Public Overridable Function GetDBName(ByVal control As String) As String        Return ""    End Function    '定义虚函数GetTable,获取不同数据库的表名        Public Overridable Function GetTable() As String        Return ""    End Function    '把表显示到DataGridView中    Protected Overridable Sub Todatagridview()        DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells    End Sub    '1查询与日期、时间    Private Sub cmbField1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbField1.SelectedIndexChanged        If cmbField1.Text = "上机日期" Or           cmbField1.Text = "下机日期" Then            dtp1.Visible = True            txtContent1.Visible = False        End If    End Sub    '2查询与日期、时间    Private Sub cmbField2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbField2.SelectedIndexChanged        If cmbField2.Text = "上机日期" Or            cmbField2.Text = "下机日期" Then            dtp2.Visible = True            txtContent2.Visible = False        End If    End Sub    '3查询与日期、时间    Private Sub cmbField3_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbField3.SelectedIndexChanged        If cmbField3.Text = "上机日期" Or            cmbField3.Text = "下机日期" Then            dtp3.Visible = True            txtContent3.Visible = False        End If    End Sub    '清空:调用模块中的清空方法    Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click        Call Rdim()        If AllEmpty(arrayControl) Then            Exit Sub        End If        DataGridView1.DataSource = ""    End Sub    '清空:定义一个过程Rdim(),作用是初始化这个Term类型的结构体数组    Private Sub Rdim()        '重定义数组维数        ReDim Preserve arrayControl(10)        '初始化数组        arrayControl(0) = New Term(cmbField1, "字段名")        arrayControl(1) = New Term(cmbField2, "字段名")        arrayControl(2) = New Term(cmbField3, "字段名")        arrayControl(3) = New Term(cmbOperator1, "操作符")        arrayControl(4) = New Term(cmbOperator2, "操作符")        arrayControl(5) = New Term(cmbOperator3, "操作符")        arrayControl(6) = New Term(txtContent1, "查询内容")        arrayControl(7) = New Term(txtContent2, "查询内容")        arrayControl(8) = New Term(txtContent3, "查询内容")        arrayControl(9) = New Term(cmbRelation1, "组合关系")        arrayControl(10) = New Term(cmbRelation2, "组合关系")    End Sub    '退出    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click        Me.Close()    End SubEnd Class



                      四、操作符和组合关系下拉框的符号啥的我没写代码,直接改的属性!


0 0
原创粉丝点击