前言:
组合查询可以说是机房收费系统的核心之一了,在完成这部分的内容让我收获颇多,熟练掌握了封装类,封装方法,构造重载,总之代码的冗余度明显减少,大家一起来看看吧!
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
后记:
组合查询就结束了,如果看了此篇博客,对你有所帮助,一定要赞一个欧!