【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: 2018—8—8
-- 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层之父窗体

这个层先建立一个父窗体,然后让它的子类去继承它!
这里写图片描述
模版方法的核心就是将重复的代码统统都放到模版里,而每个窗体不一样的部分要写成虚方法,然后子类进行重写!

父窗体

 	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
这里写图片描述

后记:

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

评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值