博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个使用delegate委托进行资料查询过滤的例子
阅读量:4042 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
SQL 多表联合查询
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>