WINFORM 多条件动态查询 通用代码的设计与实现
http://blog.csdn.net/huomm/archive/2008/03/22/2205564.aspx
经常碰到多条件联合查询的问题,以前的习惯认为很简单总会从头开始设计布局代码,往往一个查询面要费上老半天的功夫,而效果也不咋地。
前段时间做了个相对通用的多条件动态查询面,复用起来还是挺方便的,放上来共参考指导 。
供下载的源文件链接 : 多条件动态查询通用模板下载
主要的运行后布局:
主要的通用功能和要求:
主要的方法体:
动态的显示查询条件:
按查询条件设置显示模式:
1 //初始化联合查询的页面显示
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");
16
17
18 try
19 {
20 for (int i = 0; i < this.fpl.Controls.Count; i++)
21 {
22
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 }
30
31 }
32
33
34 }
35 catch (Exception ex)
36 {
37 MessageBox.Show(ex.Message);
38 }
39
40
41
42 }
1 private void SetFilterCondition(ref ComboBox conditionselect)
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;
35
36 }
37
38
39
40 }
41 }
42 }
43 catch (Exception ex)
44 {
45 MessageBox.Show(ex.Message);
46 }
47 }
添加条件
提取sql语句
1
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
15
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 }
24
25 }
26 }
27 catch (Exception ex)
28 {
29 MessageBox.Show(ex.Message);
30 }
31 }
1 private string BuildSQL()
2 {
3 try
4 {
5
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 }
83
84 }
注: 在设计过程中觉得最烦乱得是布局的设计 ,也许是不太熟练,浪费了很多的时间,好在通用或之际copy就ok了
供下载的源文件链接 : 多条件动态查询通用模板下载