窗体继承

    我们都知道面向对象的特征是封装、继承和多态,封装我们在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层是如何实现对数据库的操作的,下篇博客会提到实现的方
 法-存储过程
时间: 2024-10-10 23:38:14

窗体继承的相关文章

vb.net窗体继承

在开发项目的时候,我们常常会遇到界面特别相似的窗体,这时我们就可以用窗体继承了.下面通过一个简单的实例来实现窗体继承. 1.创建父窗体Form1 2.把需要重写的事件改为Overridable,将private保护类型改为protected或者pubic 3.通过Windows Forms添加继承的窗体,如下图 然后继承的窗体就创建出来了 4.接下来你就可以改造这个窗体了,以重写Form_Load事件为例 5.创建Form3,把这两个窗体Show一下,让我们看下效果("父窗体"改为了&

窗体的复用----窗体继承

众所周知,在面向对象的软件开发中,通过对类的封装和抽象,可以对类进行继承,从而实现代码复用和增加软件的可维护性.那么,窗体能不能继承呢?在重构机房收费系统的时候遇到了如下问题: 相似的几个功能,窗体布局一模一样,如果使用以前的方法,只能复制.粘贴这些窗体和控件,可是,控件可以复制,名字却不能复制:如果改其中的一项数据的话,需要修改好几个窗体,可维护性差:U层.B层.D层代码相似度很高,代码复用性太低等等.怎么解决这些问题呢? 类可以进行抽象.封装,然后可以继承以复用,窗体能不能看做一个特殊的类?

B窗体继承于A窗体,B启动:问题点

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) pnl1: TPanel; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.d

winform窗体继承泛型类时,设计器无法使用解决办法

当我们使用winform程序时,winform窗体程序和控件程序都是可以通过设计器进行控件拖拽的,但如果我们继承了一个带有泛型的form基类.那么设计器是无法使用的. 目前我没有找到根本解决的办法,但可以间接解决无法调试的问题. 下面具体说明如何实现 比如我们有FormA,BaseForm<Entity>, FormA : BaseForm<XXX> 这样直接继承是无法使用设计器的. 需要增加一个临时的form类,比如TempForm. 由TempForm先继承BaseForm, 

Delphi_子窗体继承父窗体后如何显示父窗体上的控件

1.创建子窗体Form1 File -> New -> Form,新建一个form,在form的单元文件中修改 2.子窗体中引用父窗体单元 uses TFatherForm 3.将子窗体中代码修改 TForm1 = class(TForm) 改为 TForm1 = class(TFatherForm) //TFatherForm为被继承的窗体 4.在Form窗体上弹出右键菜单,选择View As Text 把第一行的Object 改成 inherited 后保存: 5.在Form标签上点击右键

wpf自定义控件或窗体继承问题,继承之后出现不能是 XAML 文件的根

我们在WPF中创建baseWindow或者想继承一个自定义的USERCONTROL时,经常会遇到 "继承之后出现不能是 XAML 文件的根" 这样的错误. 原因是继承类如果重新定义窗体内容会冲掉基类的所有内容: 解决方法:1.基类设成一个继承Window或者UserControl普通的类文件,不要创建成带XAML的文件. 或者 利用自定义控件,创建各自的ControlTemplate, 2.在继承窗体或控件中 添加OnContentChanged方法, 然后把基类窗体或控件的内容填充进

手动修改继承窗体

转自http://blog.csdn.net/atian2009/article/details/7478234 1.手工修改窗体继承时,怎样让其父类的所有控件显示(在设计时)? File -> New -> Form,新建一个form,在form的单元文件中修改 TForm1 = class(TForm) 为: TForm1 = class(TFatherForm) //TFatherForm为被继承的窗体 不要忘记  uses TFatherForm的单元文件, 再在Form窗体上弹出右键

MDI和继承窗体设计

MDI窗体设计:(Multiple-Document Interface) 用途:用于同时显示多个文档,每个文档显示在各自的窗体中. 起到容器作用的窗体被称为"父窗体",可放在父窗体中的其他窗体称为"子窗体",也称为"MDI子窗体". 每个应用程序只能有一个父窗体,并且其他子窗体不能移出父窗体的框架区域. 1.设置父窗体: 在窗体的属性面板 将IsMdiContainer属性设置为True即可 2.设置子窗体: 通过设置窗体的MdiParent属

Android视图载入到窗体的过程分析

上一篇博客Android中Handler原理在讲到Handler的时候谈到了android的Activity启动是怎样运行到onCreate方法的,这篇主要从onCreate方法里面我们必需要写的方法setContentView開始,研究布局视图是怎样载入到手机窗体上的. 当在运行到setContentView时,实际上运行的是 public void setContentView(int layoutResID) { getWindow().setContentView(layoutResID