【C# 机房重构】组合查询 +存储过程+模板方法

前言:

组合查询可以说是机房收费系统的核心之一了,在完成这部分的内容让我收获颇多,熟练掌握了封装类,封装方法,构造重载,总之代码的冗余度明显减少,大家一起来看看吧!

1、实体层(entity)

 public class GroupFindTemplate
    {
        public string cboField1 { get; set; }
        public string cboField2 { get; set; }
        public string cboField3 { get; set; }
        public string cboMark1 { get; set; }
        public string cboMark2 { get; set; }
        public string cboMark3 { get; set; }
        public string Content1 { get; set; }
        public string Content2 { get; set; }
        public string Content3 { get; set; }
        public string Relationship1 { get; set; }
        public string Relationship2 { get; set; }
        public string DbtableName { get; set; }
    }

2、DAL层

在D层调用了存储过程,@”PROC_GroupCheck”

   public class GroupFindTemplateDAL:IDAL.GroupFindTemplateIDAL
    {
        SqlHelper sqlhelper = new SqlHelper();
        public DataTable GroupFindtemplate(Entity.GroupFindTemplate groupfind)
        {  
            SqlParameter[] sqlParams = { new SqlParameter("@cboFiled1", groupfind.cboField1),
                                         new SqlParameter("@cboFiled2", groupfind.cboField2),
                                         new SqlParameter("@cboFiled3", groupfind.cboField3),
                                         new SqlParameter("@cboMark1",groupfind.cboMark1),
                                         new SqlParameter("@cboMark2",groupfind.cboMark2),
                                         new SqlParameter("@cboMark3",groupfind.cboMark3),
                                         new SqlParameter("@Content1",groupfind.Content1),
                                         new SqlParameter("@Content2",groupfind.Content2),
                                         new SqlParameter("@Content3",groupfind.Content3),
                                         new SqlParameter("@Relationship1",groupfind.Relationship1),
                                         new SqlParameter("@Relationship2",groupfind.Relationship2),
                                         new SqlParameter("@Dbtablename",groupfind.DbtableName)
            };
            string sql = @"PROC_GroupCheck";
            DataTable table = sqlhelper.ExecuteQuery(sql, sqlParams, CommandType.StoredProcedure);
            return table;
        }        
    }

3、存储过程的建立

打开你的sql server 然后点击数据库,找到你的机房收费系统charge ,然后点击可编程性,在点击你的存储过程,出现一个下拉框,然后点存储过程!就可以在里边写代码了!
这里写图片描述

代码:

USE [charge_sys]
GO
/****** Object:  StoredProcedure [dbo].[PROC_GroupCheck]    Script Date: 2018/8/12 9:01:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      李光
-- Create date: 201888
-- Description: 组合查询时候进行数据交互
-- =============================================
ALTER PROCEDURE [dbo].[PROC_GroupCheck]  
/****需要传递的参数****/
@cboFiled1 varchar(20),
@cboFiled2 varchar(20),
@cboFiled3 varchar(20),
@cboMark1 varchar(10),
@cboMark2 varchar(10),
@cboMark3 varchar(10),
@Content1 varchar(20),
@Content2 varchar(20),
@Content3 varchar(20),
@Relationship1 varchar(10),
@Relationship2 varchar(10),
@DbtableName varchar(20)
AS
    declare @TempSql varchar(500)
BEGIN
    SET @TempSql='SELECT * FROM '+@DbtableName+' WHERE '+@cboFiled1+@cboMark1+char(39)+@Content1+char(39)
    if(@Relationship1!='')
    BEGIN
        SET @TempSql=@TempSql+@Relationship1+CHAR(32)+@cboFiled2+@cboMark2+char(39)+@Content2+char(39)
        if(@Relationship2!='')
        BEGIN
        SET @TempSql=@TempSql+@Relationship2+CHAR(32)+@cboFiled3+@cboMark3+char(39)+@Content3+char(39)
        END
    END
ExECUTE(@TempSql)
END```

####4、UI层之父窗体

这个层先建立一个父窗体,然后让它的子类去继承它!
![这里写图片描述](https://img-blog.csdn.net/20180812090609270?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2plcnJ5MTExMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
模版方法的核心就是将重复的代码统统都放到模版里,而每个窗体不一样的部分要写成虚方法,然后子类进行重写!

父窗体

public partial class frmGroupFindFatherTemplate : Form
{
public frmGroupFindFatherTemplate()
{
InitializeComponent();
//初始化一样内容的部分
cboConbination1.Items.Add(“或”);
cboConbination1.Items.Add(“且”);
cboConbination2.Items.Add(“或”);
cboConbination2.Items.Add(“且”);
}

    private void btnQuerry_Click(object sender, EventArgs e)
    {

     /*
     * 这段代码保证了所有在panel容器上的Enabled属性为true的控件里边的内容不能为空
     *cl  为Control实例化的对象
     */
        foreach (Control cl in panel1.Controls)
        {
            if ((cl is ComboBox || cl is TextBox)&& cl.Enabled == true)
            {
                if (cl.Text.Trim() == "")
                {
                    MessageBox.Show("请将您的信息填写完整!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;//退出过程
                }
            }
        }


                Facade.GroupFindTemplateFacade FGroupFind = new Facade.GroupFindTemplateFacade();
                Entity.GroupFindTemplate groupInfo = new Entity.GroupFindTemplate();


                //为实体层赋值
                groupInfo.DbtableName = GetDbTableName();

                groupInfo.cboField1 = GetEnglishFromFiled(cboFiled1.Text.Trim());
                groupInfo.cboField2 = GetEnglishFromFiled(cboFiled2.Text.Trim());
                groupInfo.cboField3 = GetEnglishFromFiled(cboFiled3.Text.Trim());

                groupInfo.cboMark1 = cboMark1.Text.Trim();
                groupInfo.cboMark2 = cboMark2.Text.Trim();
                groupInfo.cboMark3 = cboMark3.Text.Trim();

                groupInfo.Content1 = txtContent1.Text.Trim();
                groupInfo.Content2 = txtContent2.Text.Trim();
                groupInfo.Content3 = txtContent3.Text.Trim();

                groupInfo.Relationship1 = GetEnglishFromFiled(cboConbination1.Text.Trim());
                groupInfo.Relationship2 = GetEnglishFromFiled(cboConbination2.Text.Trim());

                bool result = false;
                result = FGroupFind.GroupFindflag(groupInfo);
                if (result == true)
                {
                    MessageBox.Show("查找成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    DataTable dt = new DataTable();
                    dt = FGroupFind.GroupFindDable(groupInfo);
                    dataGridView1.DataSource = dt;
                    dataGridView1.AllowUserToAddRows = false;
                }
                else
                {
                    MessageBox.Show("不存在您所查找的信息");
                }                                            

    }
    //清空
    private void btnClear_Click(object sender, EventArgs e)
    {

      //Clear这个类是我之前自己封装的,现在直接用!Clear(this, panel1)是Clear中的一个重载!
        Clear clear = new Clear(this, panel1);
        DataTable Table=null;
        dataGridView1.DataSource = Table;


        //控件的初始化
        cboFiled2.Enabled = false;
        cboFiled3.Enabled = false;
        cboMark2.Enabled = false;
        cboMark3.Enabled = false;
        txtContent2.Enabled = false;
        txtContent3.Enabled = false;
        cboConbination1.Enabled = false;
        cboConbination2.Enabled = false;
    }

//关闭
private void btnQuit_Click(object sender, EventArgs e)
{
this.Close();
}

    //定义一个数据库中不同表的名字的虚方法,在子窗体进行重写
    public virtual string GetDbTableName()
    {
        return "";
    }
    //转换中文字符为英文字符,在子窗体进行重写!
    public virtual string GetEnglishFromFiled(string cbo)
    {
        return "";
    }


    //选择且或者或的时候,出来下一行信息
    private void cboConbination1_SelectedIndexChanged(object sender, EventArgs e)
    {

        string relationship = cboConbination1.Text.Trim();
        switch (relationship)
        {
            case "且":
                cboFiled2.Enabled = true;
                cboMark2.Enabled = true;
                txtContent2.Enabled = true;
                break;
            case "或":
                cboFiled2.Enabled = true;
                cboMark2.Enabled = true;
                txtContent2.Enabled = true;
                break;
            //case "":
            //    MessageBox.Show("请选择“且”或者“或”");
            //    break;
        }
    }
    //当第一行所有的内容添加完毕,此时关系下拉框被激活
    private void txtContent1_TextChanged(object sender, EventArgs e)
    {
        if (cboFiled1.Text!=""&&cboMark1.Text!=""&&txtContent1.Text!="")
        {
            cboConbination1.Enabled = true;
        }
    }


    /*
     * 当填满第二行的内容时,cboConbination2激活!
     * 
     * 当选中cboConbination2中的内容,最后一行的内容全部激活!
     */
    private void txtContent2_TextChanged(object sender, EventArgs e)
    {
        if (cboFiled2.Text != "" && cboMark2.Text != "" && txtContent2.Text != "")
        {
            cboConbination2.Enabled = true;
        }
    }

    private void cboConbination2_SelectedIndexChanged(object sender, EventArgs e)
    {
        string relationship = cboConbination2.Text.Trim();
        switch (relationship)
        {
            case "且":
                cboFiled3.Enabled = true;
                cboMark3.Enabled = true;
                txtContent3.Enabled = true;
                break;
            case "或":
                cboFiled3.Enabled = true;
                cboMark3.Enabled = true;
                txtContent3.Enabled = true;
                break;
        }
    }



    //构造一个没有任何返回值的虚方法,来根据cbofiled的内容,出现相应的下拉内容!
    public virtual void addcontent(ComboBox file,ComboBox mark)
    {

    }
    /*
     * 
     *一下三个方法是根据file中的内容添加cbomark中的符号  
     */
    #region MyRegion

    public void cboFiled1_SelectedIndexChanged(object sender, EventArgs e)
    {
        addcontent(cboFiled1, cboMark1);
    }

    private void cboFiled2_SelectedIndexChanged(object sender, EventArgs e)
    {
        addcontent(cboFiled2, cboMark2);
    }

    private void cboFiled3_SelectedIndexChanged(object sender, EventArgs e)
    {
        addcontent(cboFiled3, cboMark3);
    }
    #endregion
}

5、UI层之子窗体

如何建立子窗体:
右击你的UI层,点击添加,选择windows窗体,出现下图!

这里写图片描述

选择Windows Forms 然后选择继承的窗体,点击添加!出现下图,
这里写图片描述
然后找到你的模版窗体,在点击确定!

子窗体代码!

public partial class frmOpeStudentBasicInformationMaintain : UI.操作员.frmGroupFindFatherTemplate
    {
        public frmOpeStudentBasicInformationMaintain()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 根据字段添加内容
        /// </summary>
        /// <param name="字段"></param>
        /// <param name="cbomark"></param>
        public   override void addcontent(ComboBox cbofiled, ComboBox cbomark)
        {
            switch (cbofiled.Text)
            {
                case "姓名":
                case "卡号":
                case "学号":
                case "性别":
                case "系别":
                    cbomark.Text = "";
                    cbomark.Items.Clear();
                    cbomark.Items.Add("=");
                    cbomark.Items.Add("<>");
                    break;
                case "年级":
                case "班级":
                    cbomark.Text = "";
                    cbomark.Items.Clear();
                    cbomark.Items.Add("=");
                    cbomark.Items.Add("<>");
                    cbomark.Items.Add("<");
                    cbomark.Items.Add(">");
                    break;
            }
        }

        //重写了获取数据库中表的名字的方法
        public override string GetDbTableName()
        {
            return "student_Info";
        }
        //重写了英文转换成数据库中所识别英文的方法
        public override string GetEnglishFromFiled(string comboboxName)
        {
            switch (comboboxName)
            {
                case "卡号":
                    return "cardno";
                case "姓名":
                    return "studentName";
                case "学号":
                    return "Studentno";
                case "性别":
                    return "sex";
                case "系别":
                    return "department";
                case "年级":
                    return "grade";
                case "班级":
                    return "class";
                case "或":
                    return " OR ";
                case "且":
                    return " AND ";
                default:
                    return "";
            }                
        }

        private void btnQuerry_Click(object sender, EventArgs e)
        {
            //设置第一行的显示
            if (dataGridView1.Rows.Count > 0)
            {
                dataGridView1.Columns[0].HeaderText = "卡号";
                dataGridView1.Columns[1].HeaderText = "学号";
                dataGridView1.Columns[2].HeaderText = "姓名";
                dataGridView1.Columns[3].HeaderText = "性别";
                dataGridView1.Columns[4].HeaderText = "专业";
                dataGridView1.Columns[5].HeaderText = "年级";
                dataGridView1.Columns[6].HeaderText = "班级";
                dataGridView1.Columns[7].HeaderText = "状态";
                dataGridView1.Columns[8].HeaderText = "余额";
                dataGridView1.Columns[9].HeaderText = "备注";
                dataGridView1.Columns[10].HeaderText = "用户类型";
            }
        }
    }

现在差不多就大功告成了,但是有一个小的问题,就是继承的所有的子窗体都是锁着的,不能修改,此时你可以把父窗体的设计器控件的权限都降低,改成public

如下图,点击 Designer设计器
这里写图片描述

,点击,然后出现代码!找到设置控件权限的代码,然后都修改为public
这里写图片描述

后记:

组合查询就结束了,如果看了此篇博客,对你有所帮助,一定要赞一个欧!

猜你喜欢

转载自blog.csdn.net/jerry11112/article/details/81603976
今日推荐