WINFORM 多条件动态查询 通用代码的设计与实现
经常碰到多条件联合查询的问题,以前的习惯认为很简单总会从头开始设计布局代码,往往一个查询面要费上老半天的功夫,而效果也不咋地。
前段时间做了个相对通用的多条件动态查询面,复用起来还是挺方便的,放上来共参考指导 。
供下载的源文件链接 : 多条件动态查询通用模板下载
主要的运行后布局:
主要的通用功能和要求:
主要的方法体:
动态的显示查询条件:
2
3 private void ConditionBind()
4 {
5 /**///查询条件邦定
6 DataTable dt = new DataTable();
7 DataColumnCollection columns = dt.Columns;
8 columns.Add("name");
9 columns.Add("key");
10 DataRowCollection rows = dt.Rows;
11 rows.Add("所有", "All");
12 rows.Add("单据号", "Code");
13 rows.Add("供应商名称", "SupplierName");
14 rows.Add("经办人", "EmployeesName");
15 rows.Add("时间", "time");
18 try
19 {
20 for (int i = 0; i < this.fpl.Controls.Count; i++)
21 {
23 if (this.Controls.Find("fpl" + i, true).Length > 0)
24 {
25 ((ComboBox)this.Controls.Find("cbSelect" + i, true)[0]).DisplayMember = "name";
26 ((ComboBox)this.Controls.Find("cbSelect" + i, true)[0]).ValueMember = "key";
27 //用copy解决联动问题
28 ((ComboBox)this.Controls.Find("cbSelect" + i, true)[0]).DataSource = dt.Copy();
29 }
31 }
34 }
35 catch (Exception ex)
36 {
37 MessageBox.Show(ex.Message);
38 }
42 }
按查询条件设置显示模式:
2 {
3 try
4 {
5 for (int i = 0; i < this.fpl.Controls.Count; i++)
6 {
7 if (conditionselect.Name == "cbSelect" + i.ToString())
8 {
9 if (conditionselect.Text == "时间")
10 {
11 if (this.Controls.Find("fplFilter" + i, true).Length > 0)
12 this.Controls.Find("fplFilter" + i, true)[0].Visible = true;
13 if (this.Controls.Find("txtFilter" + i, true).Length > 0)
14 this.Controls.Find("txtFilter" + i, true)[0].Visible = false;
15 if (this.Controls.Find("cbFilter" + i, true).Length > 0)
16 this.Controls.Find("cbFilter" + i, true)[0].Visible = false;
17 }
18 else if (conditionselect.Text == "供应商名称")//在通用中需要修改或添加
19 {
20 if (this.Controls.Find("fplFilter" + i, true).Length > 0)
21 this.Controls.Find("fplFilter" + i, true)[0].Visible = false;
22 if (this.Controls.Find("txtFilter" + i, true).Length > 0)
23 this.Controls.Find("txtFilter" + i, true)[0].Visible = false;
24 if (this.Controls.Find("cbFilter" + i, true).Length > 0)
25 this.Controls.Find("cbFilter" + i, true)[0].Visible = true;
26 }
27 else
28 {
29 if (this.Controls.Find("fplFilter" + i, true).Length > 0)
30 this.Controls.Find("fplFilter" + i, true)[0].Visible = false;
31 if (this.Controls.Find("txtFilter" + i, true).Length > 0)
32 this.Controls.Find("txtFilter" + i, true)[0].Visible = true;
33 if (this.Controls.Find("cbFilter" + i, true).Length > 0)
34 this.Controls.Find("cbFilter" + i, true)[0].Visible = false;
36 }
40 }
41 }
42 }
43 catch (Exception ex)
44 {
45 MessageBox.Show(ex.Message);
46 }
47 }
添加条件
2 private void AddFilter()
3 {
4 try
5 {
6 for (int i = 0; i < this.fpl.Controls.Count; i++)
7 {
8 可替换代码#region 可替换代码
9 //if (((FlowLayoutPanel)this.fpl.Controls[i]).Visible == false)
10 //{
11 // ((FlowLayoutPanel)this.fpl.Controls[i]).Visible = true;
12 // break;
13 //}
14 #endregion
16 if (this.Controls.Find("fpl" + i, true).Length > 0)
17 {
18 if (this.Controls.Find("fpl" + i, true)[0].Visible == false)
19 {
20 this.Controls.Find("fpl" + i, true)[0].Visible = true;
21 break;
22 }
23 }
25 }
26 }
27 catch (Exception ex)
28 {
29 MessageBox.Show(ex.Message);
30 }
31 }
提取sql语句
2 {
3 try
4 {
6 StringBuilder sb = new StringBuilder();
7 //需要的时候修改表明 得到通用
8 sb.Append("select * from InStoreBill_View ");
9 //用于判断是否是第一条数据 用于添加where的判断
10 int isFirst = 0;
11 for (int i = 0; i < this.fpl.Controls.Count; i++)
12 {
13 生成sql语句#region 生成sql语句
14 if (this.Controls.Find("fpl" + i, true)[0].Visible == true)
15 {
16
17 if (this.Controls.Find("cbSelect" + i, true)[0].Text != "所有")
18 {
19 ComboBox selectCondition = (ComboBox)this.Controls.Find("cbSelect" + i, true)[0];
20
21 if (this.Controls.Find("txtFilter" + i, true)[0].Visible == true)
22 {//为本类型
23 isFirst++;
24 if (isFirst == 1)//如果是第一次进入的话 isfirst应该为1
25 {
26 sb.Append(" where ");
27 }
28 else if (isFirst > 1)
29 {
30 sb.Append(" and ");
31 }
32 else
33 { }
34
35 sb.Append(string.Format(" {0} like '%{1}%' ", selectCondition.SelectedValue.ToString().Trim(), this.Controls.Find("txtFilter" + i.ToString(), true)[0].Text.Trim()));
36
37 }
38 else if (this.Controls.Find("cbFilter" + i, true)[0].Visible == true)
39 {//下拉框类型
40 isFirst++;
41 if (isFirst == 1)//如果是第一次进入的话 isfirst应该为1
42 {
43 sb.Append(" where ");
44 }
45 else if (isFirst > 1)
46 {
47 sb.Append(" and ");
48 }
49 else
50 { }
51 sb.Append(string.Format(" {0} like '%{1}%' ", selectCondition.SelectedValue.ToString().Trim(), this.Controls.Find("cbFilter" + i.ToString(), true)[0].Text.Trim()));
52
53
54 }
55 else
56 {//时间类型
57 isFirst++;
58 if (isFirst == 1)//如果是第一次进入的话 isfirst应该为1
59 {
60 sb.Append(" where ");
61 }
62 else if (isFirst > 1)
63 {
64 sb.Append(" and ");
65 }
66 else
67 { }
68 sb.Append(string.Format(" {0} between '{1}' and '{2}' ", selectCondition.SelectedValue.ToString().Trim(), ((DateTimePicker)this.Controls.Find("dtp" + i.ToString() + "Begin", true)[0]).Value.ToShortDateString(), ((DateTimePicker)this.Controls.Find("dtp" + i.ToString() + "End", true)[0]).Value.ToShortDateString()));
69
70 }
71
72 }
73 }
74 #endregion
75 }
76 return sb.ToString();
77 }
78 catch (Exception ex)
79 {
80 MessageBox.Show(ex.Message);
81 return "";
82 }
84 }
注: 在设计过程中觉得最烦乱得是布局的设计 ,也许是不太熟练,浪费了很多的时间,好在通用或之际copy就ok了
供下载的源文件链接 : 多条件动态查询通用模板下载
转载于:https://www.cnblogs.com/huomm/archive/2008/03/22/1117552.html
WINFORM 多条件动态查询 通用代码的设计与实现相关推荐
- mysql 使用if函数实现多条件动态查询
简单多条件动态查询 1.条件为NULL时,不起作用 set @iid = NULL; select * FROM t_sys_cpy WHERE IF(@iid is NULL,1=1,ID = @i ...
- 页面多条件组合查询功能 代码 如何写效率高_Jeecg Boot 2.2 首个里程碑版本发布,低代码平台
项目介绍 JeecgBoot是一款基于代码生成器的低代码开发平台,开源界"小普元"超越传统商业企业开发平台!采用前后端分离架构:SpringBoot 2.x,Ant Design& ...
- linq to sql的多条件动态查询(下)
借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅 这是PredicateBuilder的源文件 public static class PredicateBuilder ...{ ...
- (转)LINQ to Entities 多条件动态查询
原文地址:http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx Some ...
- Linq to sql 实现多条件的动态查询(方法一)
多条件动态查询在开发中太常见了,使用sql语句拼接很容易实现,但是在使用linq 的时候我却觉得很麻烦,思来想去,其实不然,linq 实现多条件动态查询一样可以变的很简单.话不多说,直接上例子,供大家 ...
- 航班动态查询api调用代码示例
航班动态查询api代码,航班时刻表查询可实现查询本航段的航班号.本航段的起飞时刻(时分).本航段的ASR支持标志.本航段的舱位列表.本航段的到达时刻.本航段的到达日期修正.有效期限的起始时间(年月日) ...
- jpa多表联查动态_jpa多表关联动态查询(自定义sql语句)
项目中,jpa对于简单的数据库操作很方便,但如果多表关联动态查询时,需要自己去写SQL语句拼接查询条件,以下为本人学习的例子. 类似于这种多条件动态查询: 项目用的是springboot 2.1.0. ...
- spring data jpa封装specification实现简单风格的动态查询
github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...
- jpa 动态查询条件 数组_Spring data jpa 复杂动态查询方式总结
一.Spring data jpa 简介 首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一. 诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,目前也是 ...
最新文章
- maven_Maven提示:关于可执行jar的全部
- java正则表达式逗号_正则表达式只匹配逗号而不是括号?
- stl_config.h基本宏
- PHP机器学习库php-ml的简单测试和使用
- PHP大批量正则,php – 正则表达式匹配无限数量的选项
- 将一个datetime的now转换为只有日期的_不要眨眼!中英文、大小写转换,一秒就搞定!
- Kickstart之添加自动化脚本
- JS-[IIFE闭包]
- 一道C#类型转换的思考题
- Atitit.解决org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
- inline函数_逼近函数(2)
- SCCM2012系列之六,SCCM2012部署前的WDS准备
- usb加密狗破解软件
- [飘渺女声]罗琳娜 麦肯尼(Loreena McKennitt)
- C++ 计算球体体积
- 正在安装其他程序,请等待安装完成
- LeetCode 557 反转字符串中的单词 III
- 文本文档写html图片显示不出来,word文档几种不显示图片的解决方法
- html中mark标记,html5 mark标签是什么意思?html5 mark标签的作用又是什么?
- matlab计算应力位移,2012年-有限元作业-matlab编程实现有限元求解简单结构位移及应力.doc...
热门文章
- Java实现拼音转汉字
- C语言如何实现面向对象?
- 多项式(polynomial)和 单项式(monomial)
- XScuGic_Connect分析
- 4.2.3 OS之减少磁盘延迟时间的方法(交替编号、错位命名)
- 运用HashMap和ArrayList打造一个简单的带文件的控制台学生管理系统(附上类及类方法的思维导图+控制台运行界面截图+源代码)
- python中format的用法菜鸟教程-初学者必知的Python中优雅的用法
- 博图注册表删除方法_技成周报40期 | 三菱、西门子软件安装常见出错解决方法...
- 设计模式理解:策略模式
- 常用API-1(Object类、String类、StringBuffer类、StringBuilder类)