本文共 5700 字,大约阅读时间需要 19 分钟。
近期碰到一个查询页面,逻辑很简单,就是查询资料并显示.但用户较多,提出的修改需求较频繁,有几个同事先后修改过. 开始新建时,查询用了sql + sqlparameter得到结果显示;后来用户增加查询条件, 另一同事用了Row filter进行过滤,再后来用户又加查询条件,又有同事用了 Linq过滤, hahahaha. 现在用户又要加查询条件. 打开代码一看,晕服了,各个方法间关联度很大,耦合度高,动一毛牵全身,要同时修改几个方法的内容,下决心还是重写.
主要思路:从Database get数据后,利用委托事件对数据进行过滤操作.
主要技术: 委托, Linq 目标:减少各过滤模块的耦合,降低后续修改维护成本. 遵循"闭合原则",对修改关闭,对新增开放.如果后续有新增过滤条件件需求,代码只要新增一个过滤方法和一个过滤事件,不用修改原来的方法事件.部分代码:
public delegate void QueryDelegate();//声明一个委托 public partial class SearchClientCode : Form { DataTable clientDt;//这个是查询结果的初始表 按过滤条件进行筛选后的最新结果 DataTable clientDtInit = new DataTable(); //这个等于查询结果的初始表clientDt,作为过滤条件重置后的重新查询用. 当然,条件重置后也可以采取重新从DATABASE获取的方式. Form parent; public QueryDelegate querydelegate; //也可以用 public Action queryAction; public SearchClientCode(Form parent) { InitializeComponent(); } //page_load private void SearchClientCode_Load(object sender, EventArgs e) { //get Client Datatable clientDt = getClientDt(); clientDtInit = clientDt.Copy(); //注意,要用copy,,copy to a init datatable for query reset // add RetSetQueryTb to delegate //以下是各种过滤条件,加入到委托. querydelegate += RetSetClientDt; querydelegate += Filter_ClientName; querydelegate += Filter_Status; querydelegate += Filter_ModifyDate; querydelegate();//进行过滤 bindDgv(); //显示查询结果 } //bind datagridview private void bindDgv() { dgvClient.DataSource = clientDt.DefaultView; hlper.customDataGuidView(dgvClient, getClientMapping()); dgvClient.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; } //Reset the query to init private void RetSetClientDt() { clientDt = clientDtInit.Copy(); } #region condition changed events. private void btnCurr_Click(object sender, EventArgs e) { string firstdayofmonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).ToString("dd-MM-yyyy"); string lastdayofmonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1).AddDays(-1).ToString("dd-MM-yyyy"); dtpDateFr.Text = firstdayofmonth; dtpDateTo.Text = lastdayofmonth; ModifyDate_Changed(); } .... //search client name text changed private void txtSearch_TextChanged(object sender, EventArgs e) { dgvClient.DataSource = clientDt.AsEnumerable().Where((o) => o.Field("Client_Name").ToUpper().Contains(txtSearch.Text.Trim().ToUpper())).AsDataView(); hlper.customDataGuidView(dgvClient, getClientMapping()); dgvClient.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; } //Modify_date changed private void ModifyDate_Changed() { if (!querydelegate.GetInvocationList().AsEnumerable().Contains((QueryDelegate)Filter_ModifyDate)) { querydelegate += Filter_ModifyDate; } querydelegate(); bindDgv(); } //RadioButton - Frozen All changed private void rbBlAll_CheckedChanged(object sender, EventArgs e) { if ((sender as RadioButton).Checked) // if selected { querydelegate -= Filter_FrozenStatus; } querydelegate(); bindDgv(); } //RadioButton - Frozen Status Frozen/Release changed private void rbBlFrozen_CheckedChanged(object sender, EventArgs e) { if ((sender as RadioButton).Checked) { if (querydelegate.GetInvocationList().AsEnumerable().Contains((QueryDelegate)Filter_FrozenStatus)) { querydelegate -= Filter_FrozenStatus; } querydelegate += Filter_FrozenStatus;//get the lastest filter delegate querydelegate(); bindDgv(); } } //重点:如果有新增的过滤条件 ,参考上面的事件增加一个新事件.(就是往委托中增加/更新/删除过滤事件) ...... #endregion #region filter delegate actions //filter client name private void Filter_ClientName() { if (!string.IsNullOrEmpty(txtSearch.Text.Trim())) { clientDt = clientDt.AsEnumerable().Where((o) => o.Field ("Client_Name").ToUpper().Contains(txtSearch.Text.Trim().ToUpper())).AsDataView().ToTable(); } } //filter modify date private void Filter_ModifyDate() { clientDt = clientDt.AsEnumerable().Where((o) => o.Field ("modify_date") >= DateTime.Parse(dtpDateFr.Text) && o.Field ("modify_date") <= DateTime.Parse(dtpDateTo.Text + " 23:59:59")).AsDataView().ToTable(); } //filter BL private void Filter_FrozenStatus() { string frozenstatus = rbBlFrozen.Checked ? "Frozen" : rbBlRel.Checked ? "Release" : ""; clientDt = clientDt.AsEnumerable().Where((o) => Convert.ToString(o["BLStatus"]) == frozenstatus).AsDataView().ToTable(); } //filter quot status private void Filter_QuotStatus() { string quotstatus = rbQuotStatusStop.Checked ? "Stop" : rbQuotStatusRel.Checked ? "Release" : ""; clientDt = clientDt.AsEnumerable().Where((o) => Convert.ToString(o["QuotStatus"]) == quotstatus).AsDataView().ToTable(); } //重点:如果有新增的过滤条件 ,参考上面的方法增加一个新方法.(利用Linq进行条件过滤) //...... #endregion }
转载地址:http://mimdi.baihongyu.com/