简单数据集的相关简单查询的实现.
要求:给一个表做查询.很简单.简单到我不知他的什么要求.我那就只好对DataTable做查询了.数据也不知道有什么东东.本来还想对IList<T>做到查询的,有点麻烦,暂时不做了.
先放一个接口.定义了相关查询要的规范,也可以说是契约吗.
1
public interface QueryClass2


{3

/**//// <summary>4
/// 数据集的栏位5
/// </summary>6
List<string> Columns7

{8
get; 9
}10

/**//// <summary>11
/// 查询条件12
/// </summary>13
string Where14

{15
get;16
set;17
}18

/**//// <summary>19
/// 数据集20
/// </summary>21
object DataSource22

{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>61
public delegate object Event_Select(object data);下面是相关DataTable的实现.如下
1
public class QueryTable : QueryClass2


{3
public event Event_Select event_Select;4
private DataTable table;5
public object DataSource6

{7
get8

{9
return table;10
}11
set12

{13
table = value as DataTable;14
}15
}16
public QueryTable()17

{ 18
}19
private List<string> columns;20
public List<string> Columns21

{22
get23

{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 Where37

{38
get39

{40
return where;41
}42
set43

{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
get115

{116
if (autoCompleteCount == 0)117
return int.MaxValue;118
return autoCompleteCount;119
}120
set121

{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
}上面的实现后,定义一个类,用于与外部的类和上面的接口来交互.如下
1
[Serializable]2
public class QueryData3


{4
private QueryClass query;5
private readonly string str_default = "--请选择--";6
private readonly string str_error = "请输入正确的格式";7

/**//// <summary>8
/// 封装查询接口9
/// </summary>10
public QueryClass Query11

{12
get13

{14
return query;15
}16
private set17

{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 DataSource54

{55
get56

{57
return dataSource;58
}59
set60

{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 Value95

{96
get97

{98
return _value;99
}100
set101

{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保存就好.我是如下做的.
1
public QueryData queryData2

{3
get4

{5
if (ViewState["queryData"] != null)6
return (QueryData)ViewState["queryData"];7
else8

{9
queryData = new QueryData(你的数据集);10
return queryData;11
}12
}13
set14

{15
ViewState["queryData"] = value;16
}17
}应下面一位朋友的要求,因为我没做什么美化,开始不好意思拿出来.差不多如下.


感想:
如果你永远把你的不足给藏着.那么你永远也进步不了.
浙公网安备 33010602011771号