分析petshop3.0显示产品列表
2006-04-23 19:54 Clingingboy 阅读(546) 评论(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这三个页面中,重复的使用了这个用户控件显示商品
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现