e1684626a65748ac9d1994079a5ebb0ec7b4e9f5
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / BaseDataList.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     BaseDataList\r
4  *\r
5  * Author:  Gaurav Vaish\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
8  * Implementation: yes\r
9  * Status:  100%\r
10  *\r
11  * (C) Gaurav Vaish (2001)\r
12  */\r
13 \r
14 using System;\r
15 using System.ComponentModel;\r
16 using System.Collections;\r
17 using System.Web;\r
18 using System.Web.UI;\r
19 \r
20 namespace System.Web.UI.WebControls\r
21 {\r
22         [DefaultEvent("SelectedIndexChanged")]\r
23         [DefaultProperty("DataSource")]\r
24         [ParseChildren(true)]\r
25         [PersistChildren(false)]\r
26         //TODO: [Designer("??")]\r
27         public abstract class BaseDataList: WebControl\r
28         {\r
29                 private  static readonly object SelectedIndexChangedEvent = new object();\r
30                 internal static string          ItemCountViewStateKey     = "_!ItemCount";\r
31 \r
32                 private DataKeyCollection dataKeys;\r
33                 private object            dataSource;\r
34 \r
35                 public BaseDataList() : base()\r
36                 {\r
37                 }\r
38 \r
39                 public static bool IsBindableType(Type type)\r
40                 {\r
41                         if(type.IsPrimitive || type == typeof(string) || type == typeof(DateTime) || type == typeof(Decimal))\r
42                                 return true;\r
43                         return false;\r
44                 }\r
45 \r
46                 public override ControlCollection Controls\r
47                 {\r
48                         get\r
49                         {\r
50                                 EnsureChildControls();\r
51                                 return base.Controls;\r
52                         }\r
53                 }\r
54 \r
55                 public override void DataBind()\r
56                 {\r
57                         OnDataBinding(EventArgs.Empty);\r
58                 }\r
59 \r
60                 [WebCategory("Action")]\r
61                 [WebSysDescription("BaseDataList_OnSelectedIndexChanged")]\r
62                 public event EventHandler SelectedIndexChanged\r
63                 {\r
64                         add\r
65                         {\r
66                                 Events.AddHandler(SelectedIndexChangedEvent, value);\r
67                         }\r
68                         remove\r
69                         {\r
70                                 Events.RemoveHandler(SelectedIndexChangedEvent, value);\r
71                         }\r
72                 }\r
73 \r
74                 [Bindable(true)]\r
75                 [DefaultValue(-1)]\r
76                 [WebCategory("Layout")]\r
77                 [WebSysDescription("BaseDataList_CellPadding")]\r
78                 public virtual int CellPadding\r
79                 {\r
80                         get\r
81                         {\r
82                                 if(!ControlStyleCreated)\r
83                                         return -1;\r
84                                 return ((TableStyle)ControlStyle).CellPadding;\r
85                         }\r
86                         set\r
87                         {\r
88                                 ((TableStyle)ControlStyle).CellPadding = value;\r
89                         }\r
90                 }\r
91 \r
92                 [Bindable(true)]\r
93                 [DefaultValue(-1)]\r
94                 [WebCategory("Layout")]\r
95                 [WebSysDescription("BaseDataList_CellSpacing")]\r
96                 public virtual int CellSpacing\r
97                 {\r
98                         get\r
99                         {\r
100                                 if(!ControlStyleCreated)\r
101                                         return -1;\r
102                                 return ((TableStyle)ControlStyle).CellSpacing;\r
103                         }\r
104                         set\r
105                         {\r
106                                 ((TableStyle)ControlStyle).CellSpacing = value;\r
107                         }\r
108                 }\r
109 \r
110                 [DefaultValue("")]\r
111                 [WebCategory("Data")]\r
112                 [WebSysDescription("BaseDataList_DataKeyField")]\r
113                 public virtual string DataKeyField\r
114                 {\r
115                         get\r
116                         {\r
117                                 object o = ViewState["DataKeyField"];\r
118                                 if(o!=null)\r
119                                         return (string)o;\r
120                                 return String.Empty;\r
121                         }\r
122                         set\r
123                         {\r
124                                 ViewState["DataKeyField"] = value;\r
125                         }\r
126                 }\r
127 \r
128                 [Browsable(true)]\r
129                 //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\r
130                 [WebSysDescription("BaseDataList_DataKeys")]\r
131                 public DataKeyCollection DataKeys\r
132                 {\r
133                         get\r
134                         {\r
135                                 if( dataKeys==null )\r
136                                         dataKeys = new DataKeyCollection(DataKeysArray);\r
137                                 return dataKeys;\r
138 \r
139                         }\r
140                 }\r
141 \r
142                 [DefaultValue("")]\r
143                 [WebCategory("Data")]\r
144                 [WebSysDescription("BaseDataList_DataMember")]\r
145                 public string DataMember\r
146                 {\r
147                         get\r
148                         {\r
149                                 object o = ViewState["DataMember"];\r
150                                 if(o!=null)\r
151                                         return (string)o;\r
152                                 return String.Empty;\r
153                         }\r
154                         set\r
155                         {\r
156                                 ViewState["DataMember"] = value;\r
157                         }\r
158                 }\r
159 \r
160                 [Bindable(true)]\r
161                 [DefaultValue(null)]\r
162                 //[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\r
163                 [WebCategory("Data")]\r
164                 [WebSysDescription("BaseDataList_DataSource")]\r
165                 public virtual object DataSource\r
166                 {\r
167                         get\r
168                         {\r
169                                 return dataSource;\r
170                         }\r
171                         set\r
172                         {\r
173                                 if( (value!=null) && (value is IListSource || value is IEnumerable) )\r
174                                 {\r
175                                         dataSource = value;\r
176                                 } else\r
177                                 {\r
178                                         throw new ArgumentException(HttpRuntime.FormatResourceString("Invalid_DataSource_Type", ID));\r
179                                 }\r
180                         }\r
181                 }\r
182 \r
183                 [Bindable(true)]\r
184                 [DefaultValue(GridLines.Both)]\r
185                 [WebCategory("Appearance")]\r
186                 [WebSysDescription("BaseDataList_GridLines")]\r
187                 public virtual GridLines GridLines\r
188                 {\r
189                         get\r
190                         {\r
191                                 if(ControlStyleCreated)\r
192                                         return ((TableStyle)ControlStyle).GridLines;\r
193                                 return GridLines.Both;\r
194                         }\r
195                         set\r
196                         {\r
197                                 ((TableStyle)ControlStyle).GridLines = value;\r
198                         }\r
199                 }\r
200 \r
201                 [Bindable(true)]\r
202                 [DefaultValue(HorizontalAlign.NotSet)]\r
203                 [WebCategory("Layout")]\r
204                 [WebSysDescription("BaseDataList_HorizontalAlign")]\r
205                 public virtual HorizontalAlign HorizontalAlign\r
206                 {\r
207                         get\r
208                         {\r
209                                 if(ControlStyleCreated)\r
210                                         return ((TableStyle)ControlStyle).HorizontalAlign;\r
211                                 return HorizontalAlign.NotSet;\r
212                         }\r
213                         set\r
214                         {\r
215                                 ((TableStyle)ControlStyle).HorizontalAlign = value;\r
216                         }\r
217                 }\r
218 \r
219                 protected ArrayList DataKeysArray\r
220                 {\r
221                         get\r
222                         {\r
223                                 object o = ViewState["DataKeys"];\r
224                                 if(o == null)\r
225                                 {\r
226                                         o = new ArrayList();\r
227                                         ViewState["DataKeys"] = o;\r
228                                 }\r
229                                 return (ArrayList)o;\r
230                         }\r
231                 }\r
232 \r
233                 protected override void AddParsedSubObject(object o)\r
234                 {\r
235                         // Preventing literal controls from being added as children.\r
236                 }\r
237 \r
238                 protected override void CreateChildControls()\r
239                 {\r
240                         Controls.Clear();\r
241                         if(ViewState[ItemCountViewStateKey]!=null)\r
242                         {\r
243                                 CreateControlHierarchy(true);\r
244                                 ClearChildViewState();\r
245                         }\r
246                 }\r
247 \r
248                 protected override void OnDataBinding(EventArgs e)\r
249                 {\r
250                         base.OnDataBinding(e);\r
251                         Controls.Clear();\r
252                         ClearChildViewState();\r
253                         CreateControlHierarchy(true);\r
254                         ChildControlsCreated = true;\r
255                         TrackViewState();\r
256                 }\r
257 \r
258                 protected virtual void OnSelectedIndexChanged(EventArgs e)\r
259                 {\r
260                         if(Events != null)\r
261                         {\r
262                                 EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);\r
263                                 if(eh!=null)\r
264                                         eh(this, e);\r
265                         }\r
266                 }\r
267 \r
268                 protected override void Render(HtmlTextWriter writer)\r
269                 {\r
270                         PrepareControlHierarchy();\r
271                         base.RenderContents(writer);\r
272                 }\r
273 \r
274                 protected abstract void PrepareControlHierarchy();\r
275                 protected abstract void CreateControlHierarchy(bool useDataSource);\r
276         }\r
277 }\r