分析petshop3.0显示产品列表
2006-04-23 19:54 Clingingboy 阅读(547) 评论(0) 收藏 举报
用户空间中定义一个可以分页的SimplePager.cs类,这个类继承Repeater,可以实现产品的重复显示,上下翻页
在Items.aspx,ItemDetails.aspx,Category.aspx这三个页面中,重复的使用了这个用户控件显示商品
1
using System;
2
using System.Collections;
3
using System.Collections.Specialized;
4
using System.Text;
5
using System.Text.RegularExpressions;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
9
namespace PetShop.Web.Controls {
10
public class SimplePager : Repeater {
11
12
//静态变量
13
protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td colspan=2>";
14
protected const string HTML2 = "</td></tr><tr class=gridNav><td>";
15
protected const string HTML3 = "</td><td align=right>";
16
protected const string HTML4 = "</td></tr></table>";
17
private static readonly Regex RX = new Regex(@"^&page=\d+", RegexOptions.Compiled);
18
private const string LINK_PREV = "<a href=?page={0}><img src=Images/buttonPrev.gif alt=Previous border=\"0\"></a>";
19
private const string LINK_MORE = "<a href=?page={0}><img src=Images/buttonMore.gif alt=More border=\"0\"></a>";
20
private const string KEY_PAGE = "page";
21
private const string COMMA = "?";
22
private const string AMP = "&";
23
24
protected string emptyText;
25
private IList dataSource;
26
private int pageSize = 10;
27
private int currentPageIndex;
28
private int itemCount;
29
30
override public object DataSource {
31
set {
32
33
try{
34
dataSource = (IList)value;
35
ItemCount = dataSource.Count;
36
}catch{
37
dataSource = null;
38
ItemCount = 0;
39
}
40
}
41
}
42
43
/// <summary>
44
/// 一页产品数量
45
/// </summary>
46
public int PageSize {
47
get { return pageSize; }
48
set { pageSize = value; }
49
}
50
51
/// <summary>
52
/// 总有几页
53
/// </summary>
54
protected int PageCount {
55
get { return (ItemCount - 1) / pageSize; }
56
}
57
58
/// <summary>
59
/// 产品数量
60
/// </summary>
61
virtual protected int ItemCount {
62
get { return itemCount; }
63
set { itemCount = value; }
64
}
65
66
/// <summary>
67
/// 当前页
68
/// </summary>
69
virtual public int CurrentPageIndex {
70
get { return currentPageIndex; }
71
set { currentPageIndex = value; }
72
}
73
74
public string EmptyText {
75
set { emptyText = value; }
76
}
77
78
/// <summary>
79
/// 设置分页
80
/// </summary>
81
/// <param name="index"></param>
82
public void SetPage(int index) {
83
OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
84
}
85
86
override protected void OnLoad(EventArgs e) {
87
if (Visible) {
88
string page = Context.Request[KEY_PAGE];
89
int index = (page != null) ? int.Parse(page) : 0;
90
SetPage(index);
91
}
92
}
93
94
95
/// <summary>
96
/// 控制页面重复显示内容重写
97
/// </summary>
98
/// <param name="writer"></param>
99
override protected void Render(HtmlTextWriter writer) {
100
101
//Check there is some data attached
102
if (ItemCount == 0) {
103
writer.Write(emptyText);
104
return;
105
}
106
107
//隐藏查询
108
string query = Context.Request.Url.Query.Replace(COMMA, AMP);
109
query = RX.Replace(query, string.Empty);
110
111
// 写出控件第一行,表头信息
112
writer.Write(HTML1);
113
114
// 调用继承方法
115
base.Render(writer);
116
117
// 表格关闭标记
118
writer.Write(HTML2);
119
120
//判断是否需要上一页下一页按钮
121
//是否需要上一页按钮
122
if (currentPageIndex > 0)
123
writer.Write(string.Format(LINK_PREV, (currentPageIndex - 1) + query));
124
125
//表格关闭标记
126
writer.Write(HTML3);
127
128
//是否需要下一页按钮
129
if (currentPageIndex < PageCount)
130
writer.Write(string.Format(LINK_MORE, (currentPageIndex + 1) + query));
131
132
//表格关闭标记
133
writer.Write(HTML4);
134
}
135
136
override protected void OnDataBinding(EventArgs e) {
137
138
//找到我们想要的重复显示信息
139
int start = CurrentPageIndex * pageSize;
140
int size = Math.Min(pageSize, ItemCount - start);
141
142
IList page = new ArrayList();
143
144
//从数据源中找到它们之间的关系
145
for (int i = 0; i < size; i++)
146
page.Add(dataSource[start + i]);
147
148
//得到数据源
149
base.DataSource = page;
150
base.OnDataBinding(e);
151
152
}
153
154
public event DataGridPageChangedEventHandler PageIndexChanged;
155
156
virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e) {
157
if (PageIndexChanged != null)
158
PageIndexChanged(this, e);
159
}
160
}
161
}

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

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

在Items.aspx,ItemDetails.aspx,Category.aspx这三个页面中,重复的使用了这个用户控件显示商品