前言
模板模式在机房收费系统中适用于所有具有相同窗体界面和相同逻辑的功能。因此在机房中不单单是组合查询使用模板模式,而且在操作员根据时间查询收取金额和返还金额的操作也使用了。如果说组合查询模板模式是我们站在巨人肩膀上实现的结果,那么,根据金额查询,这就要我们举一反三,自己动手去做了。现在我愿意做一个小巨人,分享给大家代码库。哈哈。
内容
首先应该建立母版窗体,如下:
建立继承窗体,就不用一个一个画控件了。大家还会建立继承窗体么?
右击项目——>添加——>添加窗体——>windowsform——>继承的窗体
给自己的窗体起一个名字,点击确定就生成了如下的窗体。
在模板中写代码
如下:
UI层 代码:
#region 获取数据库表名
/// <summary>
/// 获取数据库表名
/// </summary>
/// <returns></returns>
protected virtual string GetdbName()
{
return "";
}
#endregion
#region 定义虚函数,将字段转化成数据库字段 +ToEnglish+郝张晶+2016年11月21日15:58:59
/// <summary>
/// 定义虚函数,将字段转化成数据库字段
/// </summary>
/// <param name="DTPDate"></param>
/// <returns></returns>
public virtual string ToEnglish(string DTPDate)
{
return "";
}
#endregion
#region 拼接查询的sql字符串 + StrText+郝张晶 +2016年12月3日11:19:21
public virtual string StrText(frmQueryRecordMonther frm, Entity.QueryRecordEntity QueryRecordentity)
{
//定义SQL语句
string CmdText;
// CmdText = "" + QueryRecordentity.StartDate + QueryRecordentity.EndDate + "'";
CmdText =""+QueryRecordentity .StartDate +" "+"between"+"'"+StartDate.Value .ToString ("yyyy-MM-dd")+"'"+" "+"and"+" "+"'"+EndDate.Value .ToString ("yyyy-MM-dd") +"'";
return CmdText;
}
#endregion
protected virtual void Todgv(DataTable myqueryRecordlist)
{
}
#region 查询时间
private void btnOK_Click(object sender, EventArgs e)
{
//先判断开始时间是否大于结束时间
//判断起始时间不能小于结束时间
//先转换为string类型
string strStart = StartDate.Text;
string strEnd = EndDate.Text;
DateTime dt1 = Convert.ToDateTime(strStart);
DateTime dt2 = Convert.ToDateTime(strEnd);
if (DateTime.Compare(dt1, dt2) > 0)
{
MessageBox.Show("起始时间不能大于结束时间!", "提示");
}
else {
//实例化窗体
frmQueryRecordMonther frmquery = new frmQueryRecordMonther();
//定义实体
Entity.QueryRecordEntity queryReocrdEntity = new Entity.QueryRecordEntity();
//给实体赋值
queryReocrdEntity.dBName = GetdbName();
queryReocrdEntity.StartDate = ToEnglish(StartDate.Text.Trim());
queryReocrdEntity.EndDate = ToEnglish(EndDate.Text.Trim());
//queryReocrdEntity.StartDate = StartDate.Text.ToString ();
//queryReocrdEntity.EndDate = EndDate.Text.ToString();
queryReocrdEntity.SQLString = StrText(frmquery, queryReocrdEntity);
//实例化外观
Facade.MixQueryFacade facMixQuery = new Facade.MixQueryFacade();
//将数据传递到外观
DataTable myqueryRecordlist = facMixQuery.SelectRecord(queryReocrdEntity);
if (myqueryRecordlist == null)
{
MessageBox.Show("没有记录!");
}
else {
dgvMother.DataSource = myqueryRecordlist;
//让数据适应单元格大小
AutoSizeColumn auto = new AutoSizeColumn();
auto.AutoSize(dgvMother);
Todgv(myqueryRecordlist);
}
}
}
#endregion
#region 当改变时间的时候 没有方法
private void DTPStart_ValueChanged(object sender, EventArgs e)
{
}
#endregion
Facade层
public DataTable SelectRecord(QueryRecordEntity enQueryRecord)
{
//定义
BLL.MixQueryBll Queryrecord = new MixQueryBll();
//调用B层方法
DataTable myrecordlist = Queryrecord.SelectRecord(enQueryRecord);
return myrecordlist;
}
BLL层:
public DataTable SelectRecord(QueryRecordEntity queryrecord)
{
DataTable dt = new DataTable();
IDAL.IGroupQuerryByDate idal = null;
idal = factory.SetGroupQuerryByDate();
dt = idal.IselectGroup(queryrecord);
return dt;
}
DAL层:
public DataTable IselectGroup(Entity.QueryRecordEntity enGroup)
{
SQLHelper sqlHelper = new SQLHelper();
//查询语句
string strText = "select * from " + enGroup.dBName + " where "+ enGroup.SQLString;
DataTable dt = new DataTable();
//查询数据库
dt = sqlHelper.ExecSelect (CommandType.Text,strText);
return dt;
}
Facatory层
public IGroupQuerryByDate SetGroupQuerryByDate()
{
IGroupQuerryByDate igroupquerrybydate = (IGroupQuerryByDate)Assembly.Load(AssemblyName).CreateInstance("GroupQuerryByDate");
return igroupquerrybydate;
}
Entity层
public class QueryRecordEntity
{
private string _dBName;
public string dBName
{
get { return _dBName; }
set { _dBName = value; }
}
private string _StartDate;
public string StartDate
{
get { return _StartDate; }
set { _StartDate = value; }
}
private string _EndDate;
public string EndDate
{
get { return _EndDate ; }
set { _EndDate = value; }
}
private string _SQLString;
public string SQLString
{
get { return _SQLString; }
set { _SQLString = value; }
}
}
继承窗体中只需要写U层的代码:
#region 对Todgv方法进行重写,文本转换为实体对应的属性
protected override void Todgv(DataTable myqueryRecordlist)
{
dgvMother.DataSource = myqueryRecordlist;
dgvMother.Columns[0].HeaderText = "学生学号";
dgvMother.Columns[1].HeaderText = "卡号";
dgvMother.Columns[2].HeaderText = "充值金额";
dgvMother.Columns[3].HeaderText = "充值日期";
dgvMother.Columns[4].HeaderText = "充值时间";
dgvMother.Columns[5].HeaderText = "充值教师";
dgvMother.Columns[6].HeaderText = "使用状态";
dgvMother.Columns[7].HeaderText = "结账状态";
//让数据适应单元格大小
AutoSizeColumn auto = new AutoSizeColumn();
auto.AutoSize(dgvMother);
}
#endregion
#region 获取数据库表名 对GetdbName方法进行重写
protected override string GetdbName()
{
return "Recharge_Info";
}
#endregion
#region 将窗体中的控件转换成数据库中的字段
public override string ToEnglish(string DTPDate)
{
return "rechargeDate";
}
#endregion
总结
举一反三,是最终的道理,这是根据时间查询返还金额和充值金额的逻辑。如有错误请大神斧正。另外如果有更简单的方法,请联系我~