要求:给一个表做查询.很简单.简单到我不知他的什么要求.我那就只好对DataTable做查询了.数据也不知道有什么东东.本来还想对IList<T>做到查询的,有点麻烦,暂时不做了.
先放一个接口.定义了相关查询要的规范,也可以说是契约吗.
Code
1public interface QueryClass
2{
3 /**//// <summary>
4 /// 数据集的栏位
5 /// </summary>
6 List<string> Columns
7 {
8 get;
9 }
10 /**//// <summary>
11 /// 查询条件
12 /// </summary>
13 string Where
14 {
15 get;
16 set;
17 }
18 /**//// <summary>
19 /// 数据集
20 /// </summary>
21 object DataSource
22 {
23 get;
24 set;
25 }
26 /**//// <summary>
27 /// 查询
28 /// </summary>
29 /// <returns></returns>
30 object Select();
31 /**//// <summary>
32 /// And查询
33 /// </summary>
34 /// <param name="column"></param>
35 /// <param name="sing"></param>
36 /// <param name="value"></param>
37 /// <returns></returns>
38 string And(string column, string sing, string value);
39 string Or(string column, string sing, string value);
40 /**//// <summary>
41 /// 自动完成
42 /// </summary>
43 /// <param name="column"></param>
44 /// <returns></returns>
45 List<string> AutoComplete(string column);
46 /**//// <summary>
47 /// 查询条件变化后引起的事件
48 /// </summary>
49 event Event_Select event_Select;
50 /**//// <summary>
51 /// 自动完成选择多少需要的数据
52 /// </summary>
53 int AutoCompleteCount { get;set;}
54 List<string> AutoComplete(string column, string value);
55}
56/**//// <summary>
57/// 事件所需的委托
58/// </summary>
59/// <param name="data"></param>
60/// <returns></returns>
61public delegate object Event_Select(object data);
1public interface QueryClass
2{
3 /**//// <summary>
4 /// 数据集的栏位
5 /// </summary>
6 List<string> Columns
7 {
8 get;
9 }
10 /**//// <summary>
11 /// 查询条件
12 /// </summary>
13 string Where
14 {
15 get;
16 set;
17 }
18 /**//// <summary>
19 /// 数据集
20 /// </summary>
21 object DataSource
22 {
23 get;
24 set;
25 }
26 /**//// <summary>
27 /// 查询
28 /// </summary>
29 /// <returns></returns>
30 object Select();
31 /**//// <summary>
32 /// And查询
33 /// </summary>
34 /// <param name="column"></param>
35 /// <param name="sing"></param>
36 /// <param name="value"></param>
37 /// <returns></returns>
38 string And(string column, string sing, string value);
39 string Or(string column, string sing, string value);
40 /**//// <summary>
41 /// 自动完成
42 /// </summary>
43 /// <param name="column"></param>
44 /// <returns></returns>
45 List<string> AutoComplete(string column);
46 /**//// <summary>
47 /// 查询条件变化后引起的事件
48 /// </summary>
49 event Event_Select event_Select;
50 /**//// <summary>
51 /// 自动完成选择多少需要的数据
52 /// </summary>
53 int AutoCompleteCount { get;set;}
54 List<string> AutoComplete(string column, string value);
55}
56/**//// <summary>
57/// 事件所需的委托
58/// </summary>
59/// <param name="data"></param>
60/// <returns></returns>
61public delegate object Event_Select(object data);
下面是相关DataTable的实现.如下
Code
1public class QueryTable : QueryClass
2{
3 public event Event_Select event_Select;
4 private DataTable table;
5 public object DataSource
6 {
7 get
8 {
9 return table;
10 }
11 set
12 {
13 table = value as DataTable;
14 }
15 }
16 public QueryTable()
17 {
18 }
19 private List<string> columns;
20 public List<string> Columns
21 {
22 get
23 {
24 if (columns == null)
25 {
26 columns = new List<string>();
27 foreach (DataColumn c in table.Columns)
28 {
29 columns.Add(c.ColumnName);
30 }
31 }
32 return columns;
33 }
34 }
35 private string where = string.Empty;
36 public string Where
37 {
38 get
39 {
40 return where;
41 }
42 set
43 {
44 //当改变Where后就会引发函数Select(在里面会引发事件,使包含这个对象的对象也可以做相应的变化)
45 where = value;
46 Select();
47 }
48 }
49 public object Select()
50 {
51 DataTable newtable = new DataTable();
52 newtable = table.Clone();
53 DataRow[] rows = table.Select(where);
54 foreach(DataRow row in rows)
55 {
56 newtable.ImportRow(row);
57 }
58 // DataSource = newtable;
59 event_Select(newtable);
60 return newtable;
61 }
62 public string Select(string column, string sing, string value)
63 {
64 return And(column, sing, value);
65 }
66 public string And(string column, string sing, string value)
67 {
68 if (!string.IsNullOrEmpty(where))
69 {
70 where += " and ";
71 }
72 if (sing == "like")
73 {
74 value = "%" + value + "%";
75 }
76 Where += column + " " + sing + " " + "'" + value + "'" + " ";
77 return where;
78 }
79 public string Or(string column, string sing, string value)
80 {
81 if (!string.IsNullOrEmpty(where))
82 {
83 where += " or ";
84 }
85 if (sing == "like")
86 {
87 value = "%" + value + "%";
88 }
89 Where += column + " " + sing + " " + "'" + value + "'" + " ";
90 return where;
91 }
92 /**//// <summary>
93 /// 这个是把当前数据表的当前栏位的数据全部加进来,可能给上层去处理分析那些是用的,数据量少时这方法好(这个方法上层只要调用一次就行)
94 /// </summary>
95 /// <param name="column"></param>
96 /// <returns></returns>
97 public List<string> AutoComplete(string column)
98 {
99 List<string> items = new List<string>();
100 if (Columns.Contains(column))
101 {
102 foreach (DataRow row in table.Rows)
103 {
104 string c = row[column].ToString();
105 if (!items.Contains(c))
106 items.Add(c);
107 }
108 }
109 return items;
110 }
111 private int autoCompleteCount = 0;
112 public int AutoCompleteCount
113 {
114 get
115 {
116 if (autoCompleteCount == 0)
117 return int.MaxValue;
118 return autoCompleteCount;
119 }
120 set
121 {
122 autoCompleteCount = value;
123 }
124 }
125 /**//// <summary>
126 /// 根据当前栏位与输入进来要匹配的字符串来加入,适合数据量大的.实时的直接分析处理.(这个方法需要上层多次来调用,实时更新)
127 /// </summary>
128 /// <param name="column"></param>
129 /// <param name="value"></param>
130 /// <returns></returns>
131 public List<string> AutoComplete(string column,string value)
132 {
133 List<string> items = new List<string>();
134 if (Columns.Contains(column))
135 {
136 foreach (DataRow row in table.Rows)
137 {
138 string c = row[column].ToString();
139 if (!items.Contains(c))
140 {
141 if (c.Contains(value))
142 {
143 items.Add(c);
144 if (items.Count >= autoCompleteCount)
145 return items;
146 }
147 }
148 }
149 }
150 return items;
151 }
152}
1public class QueryTable : QueryClass
2{
3 public event Event_Select event_Select;
4 private DataTable table;
5 public object DataSource
6 {
7 get
8 {
9 return table;
10 }
11 set
12 {
13 table = value as DataTable;
14 }
15 }
16 public QueryTable()
17 {
18 }
19 private List<string> columns;
20 public List<string> Columns
21 {
22 get
23 {
24 if (columns == null)
25 {
26 columns = new List<string>();
27 foreach (DataColumn c in table.Columns)
28 {
29 columns.Add(c.ColumnName);
30 }
31 }
32 return columns;
33 }
34 }
35 private string where = string.Empty;
36 public string Where
37 {
38 get
39 {
40 return where;
41 }
42 set
43 {
44 //当改变Where后就会引发函数Select(在里面会引发事件,使包含这个对象的对象也可以做相应的变化)
45 where = value;
46 Select();
47 }
48 }
49 public object Select()
50 {
51 DataTable newtable = new DataTable();
52 newtable = table.Clone();
53 DataRow[] rows = table.Select(where);
54 foreach(DataRow row in rows)
55 {
56 newtable.ImportRow(row);
57 }
58 // DataSource = newtable;
59 event_Select(newtable);
60 return newtable;
61 }
62 public string Select(string column, string sing, string value)
63 {
64 return And(column, sing, value);
65 }
66 public string And(string column, string sing, string value)
67 {
68 if (!string.IsNullOrEmpty(where))
69 {
70 where += " and ";
71 }
72 if (sing == "like")
73 {
74 value = "%" + value + "%";
75 }
76 Where += column + " " + sing + " " + "'" + value + "'" + " ";
77 return where;
78 }
79 public string Or(string column, string sing, string value)
80 {
81 if (!string.IsNullOrEmpty(where))
82 {
83 where += " or ";
84 }
85 if (sing == "like")
86 {
87 value = "%" + value + "%";
88 }
89 Where += column + " " + sing + " " + "'" + value + "'" + " ";
90 return where;
91 }
92 /**//// <summary>
93 /// 这个是把当前数据表的当前栏位的数据全部加进来,可能给上层去处理分析那些是用的,数据量少时这方法好(这个方法上层只要调用一次就行)
94 /// </summary>
95 /// <param name="column"></param>
96 /// <returns></returns>
97 public List<string> AutoComplete(string column)
98 {
99 List<string> items = new List<string>();
100 if (Columns.Contains(column))
101 {
102 foreach (DataRow row in table.Rows)
103 {
104 string c = row[column].ToString();
105 if (!items.Contains(c))
106 items.Add(c);
107 }
108 }
109 return items;
110 }
111 private int autoCompleteCount = 0;
112 public int AutoCompleteCount
113 {
114 get
115 {
116 if (autoCompleteCount == 0)
117 return int.MaxValue;
118 return autoCompleteCount;
119 }
120 set
121 {
122 autoCompleteCount = value;
123 }
124 }
125 /**//// <summary>
126 /// 根据当前栏位与输入进来要匹配的字符串来加入,适合数据量大的.实时的直接分析处理.(这个方法需要上层多次来调用,实时更新)
127 /// </summary>
128 /// <param name="column"></param>
129 /// <param name="value"></param>
130 /// <returns></returns>
131 public List<string> AutoComplete(string column,string value)
132 {
133 List<string> items = new List<string>();
134 if (Columns.Contains(column))
135 {
136 foreach (DataRow row in table.Rows)
137 {
138 string c = row[column].ToString();
139 if (!items.Contains(c))
140 {
141 if (c.Contains(value))
142 {
143 items.Add(c);
144 if (items.Count >= autoCompleteCount)
145 return items;
146 }
147 }
148 }
149 }
150 return items;
151 }
152}
上面的实现后,定义一个类,用于与外部的类和上面的接口来交互.如下
Code
1[Serializable]
2public class QueryData
3{
4 private QueryClass query;
5 private readonly string str_default = "--请选择--";
6 private readonly string str_error = "请输入正确的格式";
7 /**//// <summary>
8 /// 封装查询接口
9 /// </summary>
10 public QueryClass Query
11 {
12 get
13 {
14 return query;
15 }
16 private set
17 {
18 query = value;
19 }
20 }
21 static QueryData()
22 {
23
24 }
25 public QueryData(object data)
26 {
27 //暂时只支持DataTable,而IList接口因为相关有些功能暂时没完成
28 //用Reflector相看GridView的相关实现(如对DataSocuce对IList的实现)
29 //没有成功,不知那位有GridView的源码,能编译运行的.希望可以跟踪查看相关实现
30 if (data is DataTable)
31 {
32 query = new QueryTable();
33 }
34 dataSource = data;
35 query.DataSource = data;
36 query.event_Select += new Event_Select(query_event_Select);
37 }
38 /**//// <summary>
39 /// 当query对象的查询条件改变时,会引发这个函数使自己的数据集改变
40 /// </summary>
41 /// <param name="data">数据集</param>
42 /// <returns></returns>
43 public object query_event_Select(object data)
44 {
45 dataSource = data;
46 return dataSource;
47 }
48
49 private object dataSource;
50 /**//// <summary>
51 /// 数据集
52 /// </summary>
53 public object DataSource
54 {
55 get
56 {
57 return dataSource;
58 }
59 set
60 {
61 dataSource = value;
62 }
63 }
64 /**//// <summary>
65 /// 数据集的栏位
66 /// </summary>
67 /// <param name="list"></param>
68 public void Columns(DropDownList list)
69 {
70 list.Items.Clear();
71 foreach (string c in query.Columns)
72 {
73 list.Items.Add(c);
74 }
75 list.Items.Insert(0, str_default);
76 }
77 /**//// <summary>
78 /// 支持的查询比较
79 /// </summary>
80 /// <param name="list"></param>
81 public void Sign(DropDownList list)
82 {
83 list.Items.Clear();
84 list.DataSource = CompareSign.TableSing;
85 list.DataValueField = "Value";
86 list.DataTextField = "Key";
87 list.DataBind();
88 list.Items.Insert(0, str_default);
89 }
90 private string _value = string.Empty;
91 /**//// <summary>
92 /// 现暂留
93 /// </summary>
94 public string Value
95 {
96 get
97 {
98 return _value;
99 }
100 set
101 {
102 _value = value;
103 }
104 }
105 /**//// <summary>
106 /// 实现数据And的查询
107 /// </summary>
108 /// <param name="column"></param>
109 /// <param name="sing"></param>
110 /// <param name="_value"></param>
111 /// <returns></returns>
112 public string And(string column,string sing,string _value)
113 {
114 if (column == str_default || sing == str_default || string.IsNullOrEmpty(_value))
115 return str_error;
116 Value = _value;
117 query.And(column, sing, _value);
118 return query.Where;
119 }
120 /**//// <summary>
121 /// 实现数据Or的查询
122 /// </summary>
123 /// <param name="column"></param>
124 /// <param name="sing"></param>
125 /// <param name="_value"></param>
126 /// <returns></returns>
127 public string Or(string column, string sing, string _value)
128 {
129 if (column == str_default || sing == str_default || string.IsNullOrEmpty(_value))
130 return str_error;
131 Value = _value;
132 query.Or(column, sing, _value);
133 return query.Where;
134 }
135
136 /**//// <summary>
137 /// 给自动完成的相关接口
138 /// </summary>
139 /// <param name="column"></param>
140 /// <param name="value"></param>
141 /// <returns></returns>
142 public List<string> AutoComplete(string column, string value)
143 {
144 return query.AutoComplete(column, value);
145 }
146}
1[Serializable]
2public class QueryData
3{
4 private QueryClass query;
5 private readonly string str_default = "--请选择--";
6 private readonly string str_error = "请输入正确的格式";
7 /**//// <summary>
8 /// 封装查询接口
9 /// </summary>
10 public QueryClass Query
11 {
12 get
13 {
14 return query;
15 }
16 private set
17 {
18 query = value;
19 }
20 }
21 static QueryData()
22 {
23
24 }
25 public QueryData(object data)
26 {
27 //暂时只支持DataTable,而IList接口因为相关有些功能暂时没完成
28 //用Reflector相看GridView的相关实现(如对DataSocuce对IList的实现)
29 //没有成功,不知那位有GridView的源码,能编译运行的.希望可以跟踪查看相关实现
30 if (data is DataTable)
31 {
32 query = new QueryTable();
33 }
34 dataSource = data;
35 query.DataSource = data;
36 query.event_Select += new Event_Select(query_event_Select);
37 }
38 /**//// <summary>
39 /// 当query对象的查询条件改变时,会引发这个函数使自己的数据集改变
40 /// </summary>
41 /// <param name="data">数据集</param>
42 /// <returns></returns>
43 public object query_event_Select(object data)
44 {
45 dataSource = data;
46 return dataSource;
47 }
48
49 private object dataSource;
50 /**//// <summary>
51 /// 数据集
52 /// </summary>
53 public object DataSource
54 {
55 get
56 {
57 return dataSource;
58 }
59 set
60 {
61 dataSource = value;
62 }
63 }
64 /**//// <summary>
65 /// 数据集的栏位
66 /// </summary>
67 /// <param name="list"></param>
68 public void Columns(DropDownList list)
69 {
70 list.Items.Clear();
71 foreach (string c in query.Columns)
72 {
73 list.Items.Add(c);
74 }
75 list.Items.Insert(0, str_default);
76 }
77 /**//// <summary>
78 /// 支持的查询比较
79 /// </summary>
80 /// <param name="list"></param>
81 public void Sign(DropDownList list)
82 {
83 list.Items.Clear();
84 list.DataSource = CompareSign.TableSing;
85 list.DataValueField = "Value";
86 list.DataTextField = "Key";
87 list.DataBind();
88 list.Items.Insert(0, str_default);
89 }
90 private string _value = string.Empty;
91 /**//// <summary>
92 /// 现暂留
93 /// </summary>
94 public string Value
95 {
96 get
97 {
98 return _value;
99 }
100 set
101 {
102 _value = value;
103 }
104 }
105 /**//// <summary>
106 /// 实现数据And的查询
107 /// </summary>
108 /// <param name="column"></param>
109 /// <param name="sing"></param>
110 /// <param name="_value"></param>
111 /// <returns></returns>
112 public string And(string column,string sing,string _value)
113 {
114 if (column == str_default || sing == str_default || string.IsNullOrEmpty(_value))
115 return str_error;
116 Value = _value;
117 query.And(column, sing, _value);
118 return query.Where;
119 }
120 /**//// <summary>
121 /// 实现数据Or的查询
122 /// </summary>
123 /// <param name="column"></param>
124 /// <param name="sing"></param>
125 /// <param name="_value"></param>
126 /// <returns></returns>
127 public string Or(string column, string sing, string _value)
128 {
129 if (column == str_default || sing == str_default || string.IsNullOrEmpty(_value))
130 return str_error;
131 Value = _value;
132 query.Or(column, sing, _value);
133 return query.Where;
134 }
135
136 /**//// <summary>
137 /// 给自动完成的相关接口
138 /// </summary>
139 /// <param name="column"></param>
140 /// <param name="value"></param>
141 /// <returns></returns>
142 public List<string> AutoComplete(string column, string value)
143 {
144 return query.AutoComplete(column, value);
145 }
146}
后台就这么多了,本来我想直接做成一个用户控件,可是那样限制太多了.所以就没用了.用了一个表的数据实现了下,效
果可以接受.
页面没什么了,用QueryData类就好了,因为页面刷新后类就有为空了,用ViewState保存就好.我是如下做的.
Code
1 public QueryData queryData
2 {
3 get
4 {
5 if (ViewState["queryData"] != null)
6 return (QueryData)ViewState["queryData"];
7 else
8 {
9 queryData = new QueryData(你的数据集);
10 return queryData;
11 }
12 }
13 set
14 {
15 ViewState["queryData"] = value;
16 }
17 }
1 public QueryData queryData
2 {
3 get
4 {
5 if (ViewState["queryData"] != null)
6 return (QueryData)ViewState["queryData"];
7 else
8 {
9 queryData = new QueryData(你的数据集);
10 return queryData;
11 }
12 }
13 set
14 {
15 ViewState["queryData"] = value;
16 }
17 }
应下面一位朋友的要求,因为我没做什么美化,开始不好意思拿出来.差不多如下.
感想:
如果你永远把你的不足给藏着.那么你永远也进步不了.