1. WEB服务器控件继承于System.Web.UI.Control类和System.Web.UI.IPostBackDataHandler 接口
2. 定义属性Text ,在属性中使用ViewState保存状态.声明public event EventHandler TextChanged;
3.实现 System.Web.UI.IPostBackDataHandler 接口的两个方法:





源码如下:
1
using System;
2
using System.Web.UI;
3
using System.Web.UI.WebControls;
4
using System.ComponentModel;
5
using System.Text;
6
using System.Collections.Specialized;
7
8
namespace SamWebControlLib
9
{
10
/// <summary>
11
/// 输出一个意见输入框
12
/// </summary>
13
[DefaultProperty("Text"),
14
ToolboxData("<{0}:AuditingIdea runat=server></{0}:AuditingIdea>")]
15
public class AuditingIdea : System.Web.UI.Control,IPostBackDataHandler
16
{
17
private System.Web.UI.WebControls.TextBox tb;
18
19
private string _Title;
20
/// <summary>
21
/// 标题
22
/// </summary>
23
[Bindable(true),
24
Category("标题"),
25
DefaultValue("")]
26
public string Title
27
{
28
set
29
{
30
this._Title = value;
31
}
32
get
33
{
34
return this._Title;
35
}
36
}
37
/// <summary>
38
/// 文本框的值
39
/// </summary>
40
[Bindable(true),
41
Category("文本框的值"),
42
DefaultValue("")]
43
public String Text
44
{
45
get
46
{
47
return (String) ViewState["Text"];
48
}
49
set
50
{
51
ViewState["Text"] = value;
52
}
53
}
54
55
56
private string _TextBoxID;
57
/// <summary>
58
/// 文本框的值
59
/// </summary>
60
[Bindable(true),
61
Category("文本框设置"),
62
DefaultValue("")]
63
public string TextBoxID
64
{
65
set
66
{
67
this._TextBoxID = value;
68
}
69
get
70
{
71
return this._TextBoxID;
72
}
73
}
74
public event EventHandler TextChanged;
75
76
77
protected override void OnInit(EventArgs e)
78
{
79
InitializeComponent();
80
base.OnInit (e);
81
}
82
83
private void InitializeComponent()
84
{
85
this.tb = new TextBox();
86
this.tb.ID = this._TextBoxID;
87
this.tb.Width = 500;
88
this.tb.Height = 95;
89
this.tb.TextMode = TextBoxMode.MultiLine;
90
}
91
/// <summary>
92
/// 将此控件呈现给指定的输出参数。
93
/// </summary>
94
/// <param name="output"> 要写出到的 HTML 编写器 </param>
95
protected override void Render(HtmlTextWriter output)
96
{
97
output.WriteLine("<table width='100%' border=0 cellpadding=0 cellspacing=0>");
98
output.WriteLine("<TR>");
99
output.Write("<TD width='14%' valign='top'> <span class='zclc-txt1'><IMG border='0' src='../images/edit_ico.gif'>");
100
output.WriteLine(this._Title);
101
output.WriteLine("</span></TD>");
102
output.WriteLine("<TD width='86%'>");
103
this.tb.RenderControl(output);
104
output.WriteLine("</TD></TR></table>");
105
}
106
/// <summary>
107
/// 装载回发数据
108
/// </summary>
109
/// <param name="postDataKey"></param>
110
/// <param name="values"></param>
111
/// <returns></returns>
112
public virtual bool LoadPostData(string postDataKey, NameValueCollection values)
113
{
114
String presentValue;
115
if(Text!=null)
116
presentValue = Text;
117
else
118
presentValue = "";
119
String postedValue = values[postDataKey];
120
if (!presentValue.Equals(postedValue))
121
{
122
Text = postedValue;
123
return true;
124
}
125
return false;
126
}
127
128
public virtual void RaisePostDataChangedEvent()
129
{
130
OnTextChanged(EventArgs.Empty);
131
}
132
133
protected virtual void OnTextChanged(EventArgs e)
134
{
135
if (TextChanged != null)
136
TextChanged(this,e);
137
}
138
139
}
140
}
141
142

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
