前言
在进行机房重构的时候,我们学了那么久的设计模式,不断理解,抽象具体化,都不如来一个实际的,操作一下!
俗话说:“实践是检验真理的唯一标准!”所以今天我们将模板模式和组合查询结合到一块,你会发现组合查询原来可以这么简单!
模板模式
我们要使用模板设计模式,我们首先的知道它是什么?
用我的语言来说就是,我们做的事都是重复,所以我们把重复的东西写成类封装起来,然后子类通过继承和方法的重写,实现父类定义的重复的操作,从而减少了代码量,提高了代码的复用性!
为什么在组合查询上用模板设计模式呢?
大家会发现,操作员的有三个使用到组合查询的功能,而且其功能十分相似,这正好符合模板模式的使用条件。而且你会发现如果不用设计模式的话,有很多代码都是重复多余的!
窗体设计
三个窗体,我们只需要设计一个父窗体就够了,之后的子窗体直接继承就好,控件也会随之继承下来!~
子窗体的创建
在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进行代码折叠,使自己的代码更加整洁!
给大家展示一下我的代码,大家可以借鉴一下!
未完待续
之后的查询用的存储过程,在之后的博客中会给大家分享!