窗体继承

    我们都知道面向对象的特征是封装、继承和多态,封装我们在vb版的机房中都用过,那么继承该怎么用?
 
在机房重构中有很多窗体都是相类似的,我们可以把这些窗体中公共的部分抽象出来,然后再继承这些窗体,
 可以很好的达到代码复用的效果
 一、父类窗体
    机房中组合查询的窗体一共有三个,他们除了数据显示不同之外其他基本都是一样的,我们可以把一样的
西封装起来单独构成一个父窗体
    '组合查询实体为保护型,为了子类成员函数的使用
    Protected groupcheck As New Entity.GroupCheckEntity()
    '查询按钮
    Private Sub btnCheck_Click(sender As Object, e As EventArgs) Handles btnCheck.Click
        If cobRelation1.Text = "" Then
            If CombName1.Text = "" Or txtContent1.Text = "" Or CombOper1.Text = "" Then
                MsgBox("第一行不能为空", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "系统提示")
                Exit Sub
            End If
        Else
            If cobRelation2.Text = "" Then
                If CombName2.Text = "" Or txtContent2.Text = "" Or CombOper2.Text = "" Then
                    MsgBox("第二行不能为空", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "系统提示")
                    Exit Sub
                End If
            Else
                If CombName3.Text = "" Or txtContent3.Text = "" Or CombOper3.Text = "" Then
                    MsgBox("第三行不能为空", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "系统提示")
                    Exit Sub
                End If
            End If


        End If
        '把窗体上的信息赋值给实体
        groupcheck.TableName = GetdbName()


        groupcheck.CombName1 = ToEnglish(CombName1.Text)
        groupcheck.CombName2 = ToEnglish(CombName2.Text)
        groupcheck.CombName3 = ToEnglish(CombName3.Text)


        groupcheck.CombOper1 = CombOper1.Text.Trim
        groupcheck.CombOper2 = CombOper2.Text.Trim
        groupcheck.CombOper3 = CombOper3.Text.Trim


        groupcheck.TxtContent1 = txtContent1.Text.Trim
        groupcheck.TxtContent2 = txtContent2.Text.Trim
        groupcheck.TxtContent3 = txtContent3.Text.Trim


        groupcheck.CobRelation1 = ToEnglish(cobRelation1.Text)
        groupcheck.CobRelation2 = ToEnglish(cobRelation2.Text)


        Dim dt As New DataTable


        Dim Group As New BLL.GroupCheckBLL()
        'b层返回的数据类型为Datatable
        dt = Group.GroupChecks(groupcheck)


        If dt.Rows.Count = 0 Then
            MsgBox("没有符合条件的记录", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "系统提示")
            DataGrid.DataSource = Nothing
            DataGrid.Refresh()
            Exit Sub
        Else
            '调用子窗体重写的Todatagrid方法
            Call Todatagrid()
        End If
    End Sub


    Private Sub PreStuBasicInfo_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '窗体的显示
        CombOper1.Items.Add("<")
        CombOper1.Items.Add(">")
        CombOper1.Items.Add("=")
        CombOper1.Items.Add("<>")


        CombOper2.Items.Add("<")
        CombOper2.Items.Add(">")
        CombOper2.Items.Add("=")
        CombOper2.Items.Add("<>")


        CombOper3.Items.Add("<")
        CombOper3.Items.Add(">")
        CombOper3.Items.Add("=")
        CombOper3.Items.Add("<>")


        cobRelation1.Items.Add("与")
        cobRelation1.Items.Add("或")


        cobRelation2.Items.Add("与")
        cobRelation2.Items.Add("或")


        CombName2.Enabled = False
        CombName3.Enabled = False
        CombOper2.Enabled = False
        CombOper3.Enabled = False


        txtContent2.Enabled = False
        txtContent3.Enabled = False


        DataGrid.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        'DataGridView控件,选取整行
        Dim i As Integer
        For i = 0 To DataGrid.Columns.Count - 1
            DataGrid.Columns(i).Width = DataGridViewAutoSizeColumnMode.AllCells
        Next
    End Sub


    Private Sub btnQuit_Click(sender As Object, e As EventArgs) Handles btnQuit.Click
        Me.Dispose()
    End Sub
    '定义可重写的把汉字转换为英文的方法
    Public Overridable Function ToEnglish(ByVal Name As String) As String
        Return ""
    End Function
    '定义可重写并返回要操作的数据库表
    Public Overridable Function GetdbName() As String
        Return ""
    End Function
    '定义保护类型可被子类重写的显示数据的方法
    Protected Overridable Sub Todatagrid()


    End Sub
    '界面的优化
    Private Sub cobRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cobRelation1.SelectedIndexChanged
        If cobRelation1.Text = "" Then
            CombName2.Enabled = False
            CombOper2.Enabled = False
            txtContent2.Enabled = False


            CombName3.Enabled = False
            CombOper3.Enabled = False
            txtContent3.Enabled = False


            cobRelation2.Enabled = False
        Else
            CombName2.Enabled = True
            CombOper2.Enabled = True
            txtContent2.Enabled = True


            cobRelation2.Enabled = True
        End If
    End Sub
    '界面的优化
    Private Sub cobRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cobRelation2.SelectedIndexChanged
        If cobRelation2.Text = "" Then
            CombName3.Enabled = False
            CombOper3.Enabled = False
            txtContent3.Enabled = False
        Else
            CombName3.Enabled = True
            CombOper3.Enabled = True
            txtContent3.Enabled = True
        End If
    End Sub
    '清空各个控件
    Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
        '如果comb的类型为ComBox控件那么清空
        For Each comb As Control In Me.Controls
            If comb.GetType Is GetType(ComboBox) Then
                comb.Text = ""
            End If
        Next


        txtContent1.Text = ""
        txtContent2.Text = ""
        txtContent3.Text = ""


        DataGrid.DataSource = Nothing
    End Sub
    以上是抽象出三个组合查询的公共部分,其中包含三个可以被写的方法,子窗体可以根据本窗体的需求重
 写该方法
 二、继承窗体
        '显示本窗体需要的数据
    Private Sub CheckStuInfo_Load(sender As Object, e As EventArgs) Handles MyBase.Load


        CombName1.Items.Add("学号")
        CombName1.Items.Add("姓名")
        CombName1.Items.Add("性别")
        CombName1.Items.Add("学院")
        CombName1.Items.Add("年级")
        CombName1.Items.Add("班级")
        CombName1.Items.Add("操作员")


        CombName2.Items.Add("学号")
        CombName2.Items.Add("姓名")
        CombName2.Items.Add("性别")
        CombName2.Items.Add("学院")
        CombName2.Items.Add("年级")
        CombName2.Items.Add("班级")
        CombName2.Items.Add("操作员")


        CombName3.Items.Add("学号")
        CombName3.Items.Add("姓名")
        CombName3.Items.Add("性别")
        CombName3.Items.Add("学院")
        CombName3.Items.Add("年级")
        CombName3.Items.Add("班级")
        CombName3.Items.Add("操作员")


        Me.Text = "学生基本信息维护"


        cobRelation2.Enabled = False
    End Sub
    '选择了需要的数据,并且通过ToEnglish方法转换为数据库中的字段名
    Public Overrides Function ToEnglish(Name As String) As String
        Select Case Name
            Case "学号"
                ToEnglish = "studentno"
            Case "姓名"
                ToEnglish = "name"
            Case "性别"
                ToEnglish = "sex"
            Case "学院"
                ToEnglish = "department"
            Case "年级"
                ToEnglish = "grade"
            Case "班级"
                ToEnglish = "classes"
            Case "操作员"
                ToEnglish = "head"
            Case "或"
                ToEnglish = "or"
            Case "与"
                ToEnglish = "and"
            Case Else
                ToEnglish = ""
        End Select
    End Function
    '返回要操作的数据库的表名称
    Public Overrides Function GetdbName() As String
        Return "Student_Info"
    End Function
    '显示本窗体的数据
    Protected Overrides Sub Todatagrid()
        Dim dt As New DataTable
        '定义B层GroupCheckBLL方法的新对象
        Dim ShowInfo As New BLL.GroupCheckBLL()
        '传入数据,并调用该对象的方法,返回dt
        dt = ShowInfo.GroupChecks(groupcheck)


        DataGrid.AutoGenerateColumns = True
        '改变dt中每一列要显示的名称
        dt.Columns("studentno").ColumnName = "学号"
        dt.Columns("name").ColumnName = "姓名"
        dt.Columns("sex").ColumnName = "性别"
        dt.Columns("department").ColumnName = "学院"
        dt.Columns("grade").ColumnName = "年级"
        dt.Columns("classes").ColumnName = "班级"
        dt.Columns("head").ColumnName = "操作员"
        '把值传给DataGrid控件
        DataGrid.DataSource = dt
    End Sub
   以上包含了子类窗体重写父类窗体的方法
 三、比较
   通过对继承方法实现组合查询与以前我们用VB实现组合查询的方法进行对比,我们可以很明显发现用继承
 方法的方便,而且也使得代码得到复用,显得更加简洁
   这里为什么要返回数据库表的名称?这涉及到D层是如何实现对数据库的操作的,下篇博客会提到实现的方
 法-存储过程
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值