版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
小结:
通过模板方法+存储过程,实现简易复用,帮助我们编程;