【C# 重构】-组合查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiqibei666/article/details/84196933

前言:

组合查询作为机房系统的一大项,通过运用模板方法和存储过程,使得过程中的代码量减少了好多,理解起来也比较轻松;

模板方法:

定义一个操作中算法骨架,将步骤延迟到子类中,子类可以不改变算法结构从而重定义算法某些特定步骤;实现多态性,将接口与实现分离;

存储过程:存储过程

正文:

1、父窗体-把子窗体中共有的部分放在父窗体中,进行封装;

  • 代码示例:
public frmInqFather()
        {
            InitializeComponent();
            //初始化相同内容的部分
            Relation1.Items.Add("或");
            Relation1.Items.Add("与");
            Relation2.Items.Add("或");
            Relation2.Items.Add("与");

            CmbOper1.Items.Add(">");
            CmbOper1.Items.Add("<");
            CmbOper1.Items.Add("=");
            CmbOper1.Items.Add("<>");

            CmbOper2.Items.Add(">");
            CmbOper2.Items.Add("<");
            CmbOper2.Items.Add("=");
            CmbOper2.Items.Add("<>");

            CmbOper3.Items.Add(">");
            CmbOper3.Items.Add("<");
            CmbOper3.Items.Add("=");
            CmbOper3.Items.Add("<>");
        }
  • 虚方法:
#region //虚方法
        //将查询的内容转换成数据库中的列名称
        public virtual string ToName(string combo)
        {
            return "";
        }

        //获得数据库名称
        protected virtual string Getdbtable()
        {
            return "";
        }

        //显示数据
        protected virtual void ToDgv(GroupInq GroupInq)
        {
        }
 #endregion
  • 查询:
//查询
    private void btnSearch_Click(object sender, EventArgs e)
    {
        if (Relation1.Text == "")
        {
            if (CmbName1.Text == "" || CmbOper1.Text == "" || txtContext1.Text == "")
            {
                MessageBox.Show("第一行查询条件为空,请添加条件");
                return;
            }
        }
        if (Relation1.Text != "")
        {
            if (CmbName1.Text == "" || CmbOper1.Text == "" || txtContext1.Text == "" || CmbName2.Text == "" || CmbOper2.Text == "" || txtContext2.Text == "")
            {
                MessageBox.Show("输入的第二行查询条件为空,请添加条件");
                return;
            }
        }
        if (Relation2.Text != "")
        {
            if (CmbName1.Text == "" || CmbOper1.Text == "" || txtContext1.Text == "" || CmbName2.Text == "" || CmbOper2.Text == "" || txtContext2.Text == "" || CmbName3.Text == "" || CmbOper3.Text == "" || txtContext3.Text == "")
            {
                MessageBox.Show("输入的第三行查询条件为空,请添加条件");
                return;
            }
        }

        GroupInq GroupInq = new GroupInq();
        //给实体赋值
        GroupInq.CmbName1 = ToName(CmbName1.Text.Trim());
        GroupInq.CmbName2 = ToName(CmbName2.Text.Trim());
        GroupInq.CmbName3 = ToName(CmbName3.Text.Trim());

        GroupInq.Cmboper1 = CmbOper1.Text.Trim();
        GroupInq.Cmboper2 = CmbOper2.Text.Trim();
        GroupInq.Cmboper3 = CmbOper3.Text.Trim();

        GroupInq.relation1 = ToName(CmbRelation1.Text.Trim());
        GroupInq.relation2 = ToName(CmbRelation2.Text.Trim());

        GroupInq.Txtcontext1 = txtContext1.Text.Trim();
        GroupInq.Txtcontext2 = txtContext2.Text.Trim();
        GroupInq.Txtcontext3 = txtContext3.Text.Trim();

        GroupInq.GetDataTable = Getdbtable();

        Facade.GroupInqFacade groupFind = new Facade.GroupInqFacade();
        DataTable result = new DataTable();
        //接收返回值 
        result = groupFind.GroupCheck(GroupInq);
    }
  • 清除:
//清除
    private void btnClear_Click(object sender, EventArgs e)
    {
        //调用已经封装好的类,
        //Clear(this,panel1)是Clear的一个重载
        Panel panel1 = new Panel();
        Clear clear = new Clear(this,panel1);
        DataTable table = null;
        dgvCollect.DataSource = table;

        //控件初始化
        CmbName2.Enabled = false;
        CmbName3.Enabled = false;
        CmbOper2.Enabled = false;
        CmbOper3.Enabled = false;
        txtContext2.Enabled = false;
        txtContext3.Enabled = false;
        Relation1.Enabled = false;
        Relation2.Enabled = false;
    }
  • 激活组合关系、控件显示设置:
    在这里插入图片描述
//当第一行所有内容填写完毕,激活组合关系
    private void txtContext1_TextChanged(object sender, EventArgs e)
    {
        if (CmbName1.Text != "" && CmbOper1.Text != "" && txtContext1.Text != "")
        {
            Relation1.Enabled = true;
        }
    }
    
//显示设置
private void frmInqFather_Load(object sender, EventArgs e)
    {
        DTP1.Visible = false;

        CmbName2.Enabled = false;
        CmbOper2.Enabled = false;
        Relation2.Enabled = false;
        txtContext2.Enabled = false;

        CmbName3.Enabled = false;
        CmbOper3.Enabled = false;
        txtContext3.Enabled = false;
    }

private void CmbName1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (CmbName1.Text == "上机日期" || CmbName1.Text == "下机日期")
        {
            txtContext1.Visible = false;
            DTP1.Visible = true;
            txtContext1.Text = DTP1.Value.ToString();
        }
        else
        {
            txtContext1.Visible = true;
            DTP1.Visible = false;
            txtContext1.Text = DTP1.Value.ToString();
        }
    }

2、子窗体-继承父窗体,重写父类方法,进行具体实现

//重写父类方法
//将要查询的内容转换成数据库中对应的列名称
public override string ToName(string combo)
        {
            switch (combo)
            {
                case "用户ID":
                    return "userID";
                case "上机日期":
                    return "loginDate";
                case "下机日期":
                    return "logoutDate";
                case "电脑号":
                    return "computer";
                case "与":
                    return "and";
                case "或":
                    return "or";
                default:
                    return "";
            }
        }
        
       //要查询的表的信息
        protected override string Getdbtable()
        {
            return "T_Worklog";
        }
        
      //具体要显示的数据
        protected override void ToDgv(GroupInq GroupInq)
        {
            GroupInq group = new GroupInq();
            dgvCollect.DataSource = "";
            DataTable dt = new DataTable();

            GroupInq line = new GroupInq();
            GroupInqFacade facade = new GroupInqFacade();
            dt = facade.GroupCheck(line);
            if (dt.Rows.Count == 0)
            {
                MessageBox.Show("没有相关查询记录,请重新输入查询条件");
                return;
            }
            else
            {
                //子类中需要显示的东西,父窗体负责显示
                dgvCollect.AllowUserToAddRows = false;
                dgvCollect.DataSource = dt;
                dgvCollect.Refresh();
                //设置表格样式             
            }
        }
  • 查询-具体查询执行
   //查询
    private void btnSearch_Click(object sender, EventArgs e)
    {
        //进行实体传值
        GroupInq line = new GroupInq()
        {
            CmbName1 = ToName(CmbName1.Text.Trim()),
            CmbName2 = ToName(CmbName2.Text.Trim()),
            CmbName3 = ToName(CmbName3.Text.Trim()),
            Cmboper1 = CmbOper1.Text.Trim(),
            Cmboper2 = CmbOper2.Text.Trim(),
            Cmboper3 = CmbOper3.Text.Trim(),
            relation1 = ToName(Relation1.Text),
            relation2 = ToName(Relation2.Text),
            Txtcontext1 = txtContext1.Text.Trim(),
            Txtcontext2 = txtContext2.Text.Trim(),
            Txtcontext3 = txtContext3.Text.Trim(),

            GetDataTable = Getdbtable()//从数据库中获取表格
        };
        GroupInqFacade groupfind = new GroupInqFacade();
        DataTable dt = new DataTable();
        dt = groupfind.GroupCheck(line);
        dgvCollect.AllowUserToAddRows = false;
        dgvCollect.DataSource = dt;
        
        //标题显示
        dgvCollect.Columns["serial"].Visible=false;
        dgvCollect.Columns[1].HeaderText = "用户ID";
        dgvCollect.Columns[2].HeaderText = "上机日期";
        dgvCollect.Columns[3].HeaderText = "下机日期";
        dgvCollect.Columns[4].HeaderText = "状态";
        dgvCollect.Columns[5].HeaderText = "电脑号";

        dgvCollect.Refresh();
    }

小结:

通过模板方法+存储过程,实现简易复用,帮助我们编程;

猜你喜欢

转载自blog.csdn.net/qiqibei666/article/details/84196933
今日推荐