經常碰到多條件聯合查詢的問題,以前的習慣認為很簡單總會從頭開始設計布局代碼,往往一個查詢面要費上老半天的功夫,而效果也不咋地。
前段時間做了個相對通用的多條件動態查詢面,復用起來還是挺方便的,放上來共參考指導 。
供下載的源文件鏈接 : 多條件動態查詢通用模板下載
主要的運行后布局:
主要的通用功能和要求:
主要的方法體:
動態的顯示查詢條件:
//初始化聯合查詢的頁面顯示
private void ConditionBind()
{
//查詢條件邦定
DataTable dt = new DataTable();
DataColumnCollection columns = dt.Columns;
columns.Add("name");
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
}
private void ConditionBind()
{
//查詢條件邦定
DataTable dt = new DataTable();
DataColumnCollection columns = dt.Columns;
columns.Add("name");
columns.Add("key");
10

11

12

13

14

15

18

19

20

21

23

24

25

26

27

28

29

31

34

35

36

37

38

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;
36
}
40
}
41
}
42
}
43
catch (Exception ex)
44
{
45
MessageBox.Show(ex.Message);
46
}
47
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

36

40

41

42

43

44

45

46

47

添加條件
1
2
private void AddFilter()
3
{
4
try
5
{
6
for (int i = 0; i < this.fpl.Controls.Count; i++)
7
{
8
可替換代碼
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
}

2

3

4

5

6

7

8

16

17

18

19

20

21

22

23

25

26

27

28

29

30

31

提取sql語句
1
private string BuildSQL()
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語句
75
}
76
return sb.ToString();
77
}
78
catch (Exception ex)
79
{
80
MessageBox.Show(ex.Message);
81
return "";
82
}
84
}

2

3

4

6

7

8

9

10

11

12

13

75

76

77

78

79

80

81

82

84

注: 在設計過程中覺得最煩亂得是布局的設計 ,也許是不太熟練,浪費了很多的時間,好在通用或之際copy就ok了