机房重构之组合查询【模板模式】

时间:2022-09-16 10:31:54

前言

在进行机房重构的时候,我们学了那么久的设计模式,不断理解,抽象具体化,都不如来一个实际的,操作一下!

俗话说:“实践是检验真理的唯一标准!”所以今天我们将模板模式和组合查询结合到一块,你会发现组合查询原来可以这么简单!

模板模式

我们要使用模板设计模式,我们首先的知道它是什么?

用我的语言来说就是,我们做的事都是重复,所以我们把重复的东西写成类封装起来,然后子类通过继承和方法的重写,实现父类定义的重复的操作,从而减少了代码量,提高了代码的复用性!

为什么在组合查询上用模板设计模式呢?

大家会发现,操作员的有三个使用到组合查询的功能,而且其功能十分相似,这正好符合模板模式的使用条件。而且你会发现如果不用设计模式的话,有很多代码都是重复多余的!

窗体设计

机房重构之组合查询【模板模式】

三个窗体,我们只需要设计一个父窗体就够了,之后的子窗体直接继承就好,控件也会随之继承下来!~

子窗体的创建

在UI层添加——>Windows Forms——>继承的窗体——>选择要继承的父窗体(so easy)

机房重构之组合查询【模板模式】

机房重构之组合查询【模板模式】

父窗体代码展示

        #region 清空文本内容方法
        public void Clear(Control ctrl)
        {
            foreach (Control c in this.Controls)
            {
                if (c is TextBox)
                {
                    c.Text = "";
                }
                if (c is ComboBox)
                {
                    c.Text = "";
                }
            }
        }
        #endregion
        #region 清空按钮
        private void button2_Click(object sender, EventArgs e)
        {
            Control a = new Control();
            this.Clear(a);
        }
        #endregion
        #region 定义一个获取数据的虚虚方法
        public virtual  string GetDBName(string  ctr)
        {
            return "";
        }
        #endregion
        #region 获取表格的名字虚方法
        public virtual string GetTable()
        {
            return "";
        }
        #endregion
        #region 二三行条件的设置
        private void comboBox7_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            Filed2.Enabled = true;
            Sombol2.Enabled = true;
            txtNew2.Enabled = true;
            comboBox8.Enabled = true;
        }

        private void comboBox8_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            Filed3.Enabled = true;
            Sombol3.Enabled = true;
            txtNew3.Enabled = true;
        }
       #endregion
       #region 二三行条件的设置
        private void comboBox7_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            Filed2.Enabled = true;
            Sombol2.Enabled = true;
            txtNew2.Enabled = true;
            comboBox8.Enabled = true;
        }

        private void comboBox8_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            Filed3.Enabled = true;
            Sombol3.Enabled = true;
            txtNew3.Enabled = true;
        }
        #endregion
        #region 时间控件和文本框的转换
        private void Filed1_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            if (Filed1.Text.Trim() == "上机日期" || Filed1.Text.Trim() == "下机日期"||Filed1 .Text .Trim ()=="上机时间"||Filed1 .Text .Trim ()=="下机时间")
            {
                txtNew1.Visible = false;
                dtp1.Visible = true;
                dtp1.Enabled = true;
                Sombol1.Items.Clear();
                Sombol1.Items.Add("=");
                Sombol1.Items.Add("<>");
                Sombol1.Items.Add("<");
                Sombol1.Items.Add(">");
            }
            else
            {
                txtNew1.Visible = true;
                txtNew1.Enabled = true;
                dtp1.Visible = false;
                Sombol1.Items.Clear();
                Sombol1.Items.Add("=");
                Sombol1.Items.Add("<>");
            }
        }
       #endregion
        #region 窗体加载
        private void FrmTeamInQuiryFather_Load(object sender, EventArgs e)
        {
            CenterToScreen();
            dtp1.Visible = false;
            dtp2.Visible = false;
            dtp3.Visible = false;
        }
        #endregion


        private void button1_Click_1(object sender, EventArgs e)
        {
            #region 判断输入信息是否为空
            if (Filed1.Text != "")
            {
                if (Sombol1.Text == "" || txtNew1.Text == "")
                {
                    MessageBox.Show("第一行查询语句不能为空!~");
                }
            }
            if (comboBox7.Text != "")
            {
                if (Filed2.Text == "" || Sombol2.Text == "" || txtNew2.Text == "")
                {
                    MessageBox.Show("第二行查询语句不能为空!~");
                }
            }
            if (comboBox8.Text != "")
            {
                if (Filed1.Text == "" || Sombol3.Text == "" || txtNew1.Text == "")
                {
                    MessageBox.Show("第三行查询语句不能为空!~");
                }
            }
            #endregion

            #region 给实体赋值
            Entity.Line line = new Entity.Line();
            line.Filed1 = GetDBName(Filed1.Text .Trim());
            line.Filed2 = GetDBName(Filed2.Text.Trim());
            line.Filed3 = GetDBName(Filed3.Text.Trim());

            line.Sybol1 = Sombol1.Text.Trim();
            line.Sybol2 = Sombol2.Text.Trim();
            line.Sybol3 = Sombol3.Text.Trim();

            line.Comdition1 = txtNew1.Text.Trim();
            line.Comdition2 = txtNew2.Text.Trim();
            line.Comdition3 = txtNew3.Text.Trim();

            line.Relation1 = GetDBName(comboBox7.Text.Trim());
            line.Relation2 = GetDBName(comboBox8.Text.Trim());

            line.gettablename = GetTable();

            BLL.BLL bll = new BLL.BLL();

            DataTable table = bll.TeamInQuiry (line);
            if (table .Rows .Count ==0)
            {
                MessageBox.Show("没有符合条件的信息!");
            }
            else
            {
                MessageBox.Show("查询成功!");
                dataGridView1.DataSource = table;
            }

            #endregion 

子窗体代码

学生基本信息维护为例

        #region 添加选择条件
        private void FrmBasicInfoMainTain_Load(object sender, EventArgs e)
        {
            Filed1.Items.Add("卡号");
            Filed1.Items.Add("学号");
            Filed1.Items.Add("性别");
            Filed1.Items.Add("系别");
            Filed1.Items.Add("年级");
            Filed1.Items.Add("班级");
            Filed1.Items.Add("姓名");

            Filed2.Items.Add("卡号");
            Filed2.Items.Add("学号");
            Filed2.Items.Add("性别");
            Filed2.Items.Add("系别");
            Filed2.Items.Add("年级");
            Filed2.Items.Add("班级");
            Filed2.Items.Add("姓名");

            Filed3.Items.Add("卡号");
            Filed3.Items.Add("学号");
            Filed3.Items.Add("性别");
            Filed3.Items.Add("系别");
            Filed3.Items.Add("年级");
            Filed3.Items.Add("班级");
            Filed3.Items.Add("姓名");

        }
        #endregion

        #region 条件对应英文
        public override  string GetDBName(string str)
        {
            switch (str)
            {
                case "卡号": return "cardno";
                case "姓名": return "name";
                case "性别": return "sex";
                case "系别": return "department";
                case "年级": return "grade";
                case "班级": return "class";
                case "或": return "or";
                case "且": return "and";
                default: return "";
            }            
; }
        #endregion

        public override string GetTable()
        {
            return "student_Info";
        }

注:

  • 大家可以充分利用一下#region进行代码折叠,使自己的代码更加整洁!

    机房重构之组合查询【模板模式】

给大家展示一下我的代码,大家可以借鉴一下!

未完待续

之后的查询用的存储过程,在之后的博客中会给大家分享!