2006-11-01 Igor Zelmanovich <igorz@mainsoft.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / FormView.cs
1 //\r
2 // System.Web.UI.WebControls.FormView.cs\r
3 //\r
4 // Authors:\r
5 //      Lluis Sanchez Gual (lluis@novell.com)\r
6 //\r
7 // (C) 2005 Novell, Inc (http://www.novell.com)\r
8 //\r
9 // Permission is hereby granted, free of charge, to any person obtaining\r
10 // a copy of this software and associated documentation files (the\r
11 // "Software"), to deal in the Software without restriction, including\r
12 // without limitation the rights to use, copy, modify, merge, publish,\r
13 // distribute, sublicense, and/or sell copies of the Software, and to\r
14 // permit persons to whom the Software is furnished to do so, subject to\r
15 // the following conditions:\r
16 // \r
17 // The above copyright notice and this permission notice shall be\r
18 // included in all copies or substantial portions of the Software.\r
19 // \r
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
27 //\r
28 \r
29 #if NET_2_0\r
30 \r
31 using System;\r
32 using System.Collections;\r
33 using System.Collections.Specialized;\r
34 using System.ComponentModel;\r
35 using System.Web.UI;\r
36 using System.Security.Permissions;\r
37 using System.Text;\r
38 using System.IO;\r
39 using System.Reflection;\r
40 \r
41 namespace System.Web.UI.WebControls\r
42 {\r
43         [SupportsEventValidation]\r
44         [DesignerAttribute ("System.Web.UI.Design.WebControls.FormViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]\r
45         [ControlValuePropertyAttribute ("SelectedValue")]\r
46         [DefaultEventAttribute ("PageIndexChanging")]\r
47         [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]\r
48         [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]\r
49         public class FormView: CompositeDataBoundControl, IDataItemContainer, INamingContainer, IPostBackEventHandler, IPostBackContainer\r
50         {\r
51                 object dataItem;\r
52                 \r
53                 Table table;\r
54                 FormViewRow headerRow;\r
55                 FormViewRow footerRow;\r
56                 FormViewRow bottomPagerRow;\r
57                 FormViewRow topPagerRow;\r
58                 FormViewRow itemRow;\r
59                 \r
60                 IOrderedDictionary currentEditRowKeys;\r
61                 IOrderedDictionary currentEditNewValues;\r
62                 IOrderedDictionary currentEditOldValues;\r
63                 \r
64                 ITemplate pagerTemplate;\r
65                 ITemplate emptyDataTemplate;\r
66                 ITemplate headerTemplate;\r
67                 ITemplate footerTemplate;\r
68                 ITemplate editItemTemplate;\r
69                 ITemplate insertItemTemplate;\r
70                 ITemplate itemTemplate;\r
71                 \r
72                 PropertyDescriptor[] cachedKeyProperties;\r
73                 readonly string[] emptyKeys = new string[0];\r
74                 \r
75                 // View state\r
76                 PagerSettings pagerSettings;\r
77                 \r
78                 TableItemStyle editRowStyle;\r
79                 TableItemStyle insertRowStyle;\r
80                 TableItemStyle emptyDataRowStyle;\r
81                 TableItemStyle footerStyle;\r
82                 TableItemStyle headerStyle;\r
83                 TableItemStyle pagerStyle;\r
84                 TableItemStyle rowStyle;\r
85                 \r
86                 DataKey key;\r
87                 DataKey oldEditValues;\r
88                 \r
89                 private static readonly object PageIndexChangedEvent = new object();\r
90                 private static readonly object PageIndexChangingEvent = new object();\r
91                 private static readonly object ItemCommandEvent = new object();\r
92                 private static readonly object ItemCreatedEvent = new object();\r
93                 private static readonly object ItemDeletedEvent = new object();\r
94                 private static readonly object ItemDeletingEvent = new object();\r
95                 private static readonly object ItemInsertedEvent = new object();\r
96                 private static readonly object ItemInsertingEvent = new object();\r
97                 private static readonly object ModeChangingEvent = new object();\r
98                 private static readonly object ModeChangedEvent = new object();\r
99                 private static readonly object ItemUpdatedEvent = new object();\r
100                 private static readonly object ItemUpdatingEvent = new object();\r
101                 \r
102                 // Control state\r
103                 int pageIndex;\r
104                 FormViewMode currentMode = FormViewMode.ReadOnly; \r
105                 bool hasCurrentMode;\r
106                 int pageCount = 0;\r
107                 \r
108                 public FormView ()\r
109                 {\r
110                         key = new DataKey (new OrderedDictionary ());\r
111                 }\r
112                 \r
113                 public event EventHandler PageIndexChanged {\r
114                         add { Events.AddHandler (PageIndexChangedEvent, value); }\r
115                         remove { Events.RemoveHandler (PageIndexChangedEvent, value); }\r
116                 }\r
117                 \r
118                 public event FormViewPageEventHandler PageIndexChanging {\r
119                         add { Events.AddHandler (PageIndexChangingEvent, value); }\r
120                         remove { Events.RemoveHandler (PageIndexChangingEvent, value); }\r
121                 }\r
122                 \r
123                 public event FormViewCommandEventHandler ItemCommand {\r
124                         add { Events.AddHandler (ItemCommandEvent, value); }\r
125                         remove { Events.RemoveHandler (ItemCommandEvent, value); }\r
126                 }\r
127                 \r
128                 public event EventHandler ItemCreated {\r
129                         add { Events.AddHandler (ItemCreatedEvent, value); }\r
130                         remove { Events.RemoveHandler (ItemCreatedEvent, value); }\r
131                 }\r
132                 \r
133                 public event FormViewDeletedEventHandler ItemDeleted {\r
134                         add { Events.AddHandler (ItemDeletedEvent, value); }\r
135                         remove { Events.RemoveHandler (ItemDeletedEvent, value); }\r
136                 }\r
137                 \r
138                 public event FormViewDeleteEventHandler ItemDeleting {\r
139                         add { Events.AddHandler (ItemDeletingEvent, value); }\r
140                         remove { Events.RemoveHandler (ItemDeletingEvent, value); }\r
141                 }\r
142                 \r
143                 public event FormViewInsertedEventHandler ItemInserted {\r
144                         add { Events.AddHandler (ItemInsertedEvent, value); }\r
145                         remove { Events.RemoveHandler (ItemInsertedEvent, value); }\r
146                 }\r
147                 \r
148                 public event FormViewInsertEventHandler ItemInserting {\r
149                         add { Events.AddHandler (ItemInsertingEvent, value); }\r
150                         remove { Events.RemoveHandler (ItemInsertingEvent, value); }\r
151                 }\r
152                 \r
153                 public event FormViewModeEventHandler ModeChanging {\r
154                         add { Events.AddHandler (ModeChangingEvent, value); }\r
155                         remove { Events.RemoveHandler (ModeChangingEvent, value); }\r
156                 }\r
157                 \r
158                 public event EventHandler ModeChanged {\r
159                         add { Events.AddHandler (ModeChangedEvent, value); }\r
160                         remove { Events.RemoveHandler (ModeChangedEvent, value); }\r
161                 }\r
162                 \r
163                 public event FormViewUpdatedEventHandler ItemUpdated {\r
164                         add { Events.AddHandler (ItemUpdatedEvent, value); }\r
165                         remove { Events.RemoveHandler (ItemUpdatedEvent, value); }\r
166                 }\r
167                 \r
168                 public event FormViewUpdateEventHandler ItemUpdating {\r
169                         add { Events.AddHandler (ItemUpdatingEvent, value); }\r
170                         remove { Events.RemoveHandler (ItemUpdatingEvent, value); }\r
171                 }\r
172                 \r
173                 protected virtual void OnPageIndexChanged (EventArgs e)\r
174                 {\r
175                         if (Events != null) {\r
176                                 EventHandler eh = (EventHandler) Events [PageIndexChangedEvent];\r
177                                 if (eh != null) eh (this, e);\r
178                         }\r
179                 }\r
180                 \r
181                 protected virtual void OnPageIndexChanging (FormViewPageEventArgs e)\r
182                 {\r
183                         if (Events != null) {\r
184                                 FormViewPageEventHandler eh = (FormViewPageEventHandler) Events [PageIndexChangingEvent];\r
185                                 if (eh != null) eh (this, e);\r
186                         }\r
187                 }\r
188                 \r
189                 protected virtual void OnItemCommand (FormViewCommandEventArgs e)\r
190                 {\r
191                         if (Events != null) {\r
192                                 FormViewCommandEventHandler eh = (FormViewCommandEventHandler) Events [ItemCommandEvent];\r
193                                 if (eh != null) eh (this, e);\r
194                         }\r
195                 }\r
196                 \r
197                 protected virtual void OnItemCreated (EventArgs e)\r
198                 {\r
199                         if (Events != null) {\r
200                                 EventHandler eh = (EventHandler) Events [ItemCreatedEvent];\r
201                                 if (eh != null) eh (this, e);\r
202                         }\r
203                 }\r
204                 \r
205                 protected virtual void OnItemDeleted (FormViewDeletedEventArgs e)\r
206                 {\r
207                         if (Events != null) {\r
208                                 FormViewDeletedEventHandler eh = (FormViewDeletedEventHandler) Events [ItemDeletedEvent];\r
209                                 if (eh != null) eh (this, e);\r
210                         }\r
211                 }\r
212                 \r
213                 protected virtual void OnItemInserted (FormViewInsertedEventArgs e)\r
214                 {\r
215                         if (Events != null) {\r
216                                 FormViewInsertedEventHandler eh = (FormViewInsertedEventHandler) Events [ItemInsertedEvent];\r
217                                 if (eh != null) eh (this, e);\r
218                         }\r
219                 }\r
220                 \r
221                 protected virtual void OnItemInserting (FormViewInsertEventArgs e)\r
222                 {\r
223                         if (Events != null) {\r
224                                 FormViewInsertEventHandler eh = (FormViewInsertEventHandler) Events [ItemInsertingEvent];\r
225                                 if (eh != null) eh (this, e);\r
226                         }\r
227                 }\r
228                 \r
229                 protected virtual void OnItemDeleting (FormViewDeleteEventArgs e)\r
230                 {\r
231                         if (Events != null) {\r
232                                 FormViewDeleteEventHandler eh = (FormViewDeleteEventHandler) Events [ItemDeletingEvent];\r
233                                 if (eh != null) eh (this, e);\r
234                         }\r
235                 }\r
236                 \r
237                 protected virtual void OnModeChanged (EventArgs e)\r
238                 {\r
239                         if (Events != null) {\r
240                                 EventHandler eh = (EventHandler) Events [ModeChangedEvent];\r
241                                 if (eh != null) eh (this, e);\r
242                         }\r
243                 }\r
244                 \r
245                 protected virtual void OnModeChanging (FormViewModeEventArgs e)\r
246                 {\r
247                         if (Events != null) {\r
248                                 FormViewModeEventHandler eh = (FormViewModeEventHandler) Events [ModeChangingEvent];\r
249                                 if (eh != null) eh (this, e);\r
250                         }\r
251                 }\r
252                 \r
253                 protected virtual void OnItemUpdated (FormViewUpdatedEventArgs e)\r
254                 {\r
255                         if (Events != null) {\r
256                                 FormViewUpdatedEventHandler eh = (FormViewUpdatedEventHandler) Events [ItemUpdatedEvent];\r
257                                 if (eh != null) eh (this, e);\r
258                         }\r
259                 }\r
260                 \r
261                 protected virtual void OnItemUpdating (FormViewUpdateEventArgs e)\r
262                 {\r
263                         if (Events != null) {\r
264                                 FormViewUpdateEventHandler eh = (FormViewUpdateEventHandler) Events [ItemUpdatingEvent];\r
265                                 if (eh != null) eh (this, e);\r
266                         }\r
267                 }\r
268                 \r
269                 \r
270                 [WebCategoryAttribute ("Paging")]\r
271                 [DefaultValueAttribute (false)]\r
272                 public virtual bool AllowPaging {\r
273                         get {\r
274                                 object ob = ViewState ["AllowPaging"];\r
275                                 if (ob != null) return (bool) ob;\r
276                                 return false;\r
277                         }\r
278                         set {\r
279                                 ViewState ["AllowPaging"] = value;\r
280                                 RequireBinding ();\r
281                         }\r
282                 }\r
283                 \r
284                 [UrlPropertyAttribute]\r
285                 [WebCategoryAttribute ("Appearance")]\r
286                 [DefaultValueAttribute ("")]\r
287                 [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]\r
288                 public virtual string BackImageUrl {\r
289                         get {\r
290                                 if (ControlStyleCreated)\r
291                                         return ((TableStyle) ControlStyle).BackImageUrl;\r
292                                 return String.Empty;\r
293                         }\r
294                         set {\r
295                                 ((TableStyle) ControlStyle).BackImageUrl = value;\r
296                         }\r
297                 }\r
298 \r
299                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
300                 [BrowsableAttribute (false)]\r
301                 public virtual FormViewRow BottomPagerRow {\r
302                         get {\r
303                                 EnsureDataBound ();\r
304                                 return bottomPagerRow;\r
305                         }\r
306                 }\r
307         \r
308                 [WebCategoryAttribute ("Accessibility")]\r
309                 [DefaultValueAttribute ("")]\r
310                 [LocalizableAttribute (true)]\r
311                 public virtual string Caption {\r
312                         get {\r
313                                 object ob = ViewState ["Caption"];\r
314                                 if (ob != null) return (string) ob;\r
315                                 return string.Empty;\r
316                         }\r
317                         set {\r
318                                 ViewState ["Caption"] = value;\r
319                                 RequireBinding ();\r
320                         }\r
321                 }\r
322                 \r
323                 [WebCategoryAttribute ("Accessibility")]\r
324                 [DefaultValueAttribute (TableCaptionAlign.NotSet)]\r
325                 public virtual TableCaptionAlign CaptionAlign\r
326                 {\r
327                         get {\r
328                                 object o = ViewState ["CaptionAlign"];\r
329                                 if(o != null) return (TableCaptionAlign) o;\r
330                                 return TableCaptionAlign.NotSet;\r
331                         }\r
332                         set {\r
333                                 ViewState ["CaptionAlign"] = value;\r
334                                 RequireBinding ();\r
335                         }\r
336                 }\r
337 \r
338                 [WebCategoryAttribute ("Layout")]\r
339                 [DefaultValueAttribute (-1)]\r
340                 public virtual int CellPadding\r
341                 {\r
342                         get {\r
343                                 if (ControlStyleCreated)\r
344                                         return ((TableStyle) ControlStyle).CellPadding;\r
345                                 return -1;\r
346                         }\r
347                         set {\r
348                                 ((TableStyle) ControlStyle).CellPadding = value;\r
349                         }\r
350                 }\r
351 \r
352                 [WebCategoryAttribute ("Layout")]\r
353                 [DefaultValueAttribute (0)]\r
354                 public virtual int CellSpacing\r
355                 {\r
356                         get {\r
357                                 if (ControlStyleCreated)\r
358                                         return ((TableStyle) ControlStyle).CellSpacing;\r
359                                 return 0;\r
360                         }\r
361                         set {\r
362                                 ((TableStyle) ControlStyle).CellSpacing = value;\r
363                         }\r
364                 }\r
365                 \r
366                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
367                 [BrowsableAttribute (false)]\r
368                 public FormViewMode CurrentMode {\r
369                         get {\r
370                                 return hasCurrentMode ? currentMode : DefaultMode;\r
371                         }\r
372                         private set {\r
373                                 hasCurrentMode = true;\r
374                                 currentMode = value;\r
375                         }\r
376                 }\r
377 \r
378                 FormViewMode defaultMode;\r
379 \r
380                 [DefaultValueAttribute (FormViewMode.ReadOnly)]\r
381                 [WebCategoryAttribute ("Behavior")]\r
382                 public virtual FormViewMode DefaultMode {\r
383                         get {\r
384                                 return defaultMode;\r
385                         }\r
386                         set {\r
387                                 defaultMode = value;\r
388                                 RequireBinding ();\r
389                         }\r
390                 }\r
391 \r
392                 string[] dataKeyNames;\r
393                 [DefaultValueAttribute (null)]\r
394                 [WebCategoryAttribute ("Data")]\r
395                 [TypeConverter (typeof(StringArrayConverter))]\r
396                 [EditorAttribute ("System.Web.UI.Design.WebControls.DataFieldEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]\r
397                 public virtual string[] DataKeyNames\r
398                 {\r
399                         get {\r
400                                 if (dataKeyNames == null)\r
401                                         return emptyKeys;\r
402                                 return dataKeyNames;\r
403                         }\r
404                         set {\r
405                                 dataKeyNames = value;\r
406                                 RequireBinding ();\r
407                         }\r
408                 }\r
409                 \r
410                 [BrowsableAttribute (false)]\r
411                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
412                 public virtual DataKey DataKey {\r
413                         get {\r
414                                 EnsureDataBound ();\r
415                                 return key;\r
416                         }\r
417                 }\r
418 \r
419                 [DefaultValue (null)]\r
420                 [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]\r
421                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
422                 [Browsable (false)]\r
423                 public virtual ITemplate EditItemTemplate {\r
424                         get { return editItemTemplate; }\r
425                         set { editItemTemplate = value; RequireBinding (); }\r
426                 }\r
427 \r
428                 [WebCategoryAttribute ("Styles")]\r
429                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
430                 [NotifyParentProperty (true)]\r
431                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
432                 [DefaultValueAttribute (null)]\r
433                 public TableItemStyle EditRowStyle {\r
434                         get {\r
435                                 if (editRowStyle == null) {\r
436                                         editRowStyle = new TableItemStyle ();\r
437                                         if (IsTrackingViewState)\r
438                                                 editRowStyle.TrackViewState();\r
439                                 }\r
440                                 return editRowStyle;\r
441                         }\r
442                 }\r
443                 \r
444                 [WebCategoryAttribute ("Styles")]\r
445                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
446                 [NotifyParentProperty (true)]\r
447                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
448                 [DefaultValueAttribute (null)]\r
449                 public TableItemStyle EmptyDataRowStyle {\r
450                         get {\r
451                                 if (emptyDataRowStyle == null) {\r
452                                         emptyDataRowStyle = new TableItemStyle ();\r
453                                         if (IsTrackingViewState)\r
454                                                 emptyDataRowStyle.TrackViewState();\r
455                                 }\r
456                                 return emptyDataRowStyle;\r
457                         }\r
458                 }\r
459                 \r
460                 [DefaultValue (null)]\r
461                 [TemplateContainer (typeof(FormView), BindingDirection.OneWay)]\r
462                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
463                 [Browsable (false)]\r
464                 public virtual ITemplate EmptyDataTemplate {\r
465                         get { return emptyDataTemplate; }\r
466                         set { emptyDataTemplate = value; RequireBinding (); }\r
467                 }\r
468                 \r
469                 [LocalizableAttribute (true)]\r
470                 [WebCategoryAttribute ("Appearance")]\r
471                 [DefaultValueAttribute ("")]\r
472                 public virtual string EmptyDataText {\r
473                         get {\r
474                                 object ob = ViewState ["EmptyDataText"];\r
475                                 if (ob != null) return (string) ob;\r
476                                 return string.Empty;\r
477                         }\r
478                         set {\r
479                                 ViewState ["EmptyDataText"] = value;\r
480                                 RequireBinding ();\r
481                         }\r
482                 }\r
483         \r
484                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
485                 [BrowsableAttribute (false)]\r
486                 public virtual FormViewRow FooterRow {\r
487                         get {\r
488                                 EnsureChildControls ();\r
489                                 return footerRow;\r
490                         }\r
491                 }\r
492         \r
493                 [DefaultValue (null)]\r
494                 [TemplateContainer (typeof(FormView), BindingDirection.OneWay)]\r
495                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
496                 [Browsable (false)]\r
497                 public virtual ITemplate FooterTemplate {\r
498                         get { return footerTemplate; }\r
499                         set { footerTemplate = value; RequireBinding (); }\r
500                 }\r
501 \r
502                 [LocalizableAttribute (true)]\r
503                 [WebCategoryAttribute ("Appearance")]\r
504                 [DefaultValueAttribute ("")]\r
505                 public virtual string FooterText {\r
506                         get {\r
507                                 object ob = ViewState ["FooterText"];\r
508                                 if (ob != null) return (string) ob;\r
509                                 return string.Empty;\r
510                         }\r
511                         set {\r
512                                 ViewState ["FooterText"] = value;\r
513                                 RequireBinding ();\r
514                         }\r
515                 }\r
516                 \r
517                 [WebCategoryAttribute ("Styles")]\r
518                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
519                 [NotifyParentProperty (true)]\r
520                 [DefaultValue (null)]\r
521                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
522                 public TableItemStyle FooterStyle {\r
523                         get {\r
524                                 if (footerStyle == null) {\r
525                                         footerStyle = new TableItemStyle ();\r
526                                         if (IsTrackingViewState)\r
527                                                 footerStyle.TrackViewState();\r
528                                 }\r
529                                 return footerStyle;\r
530                         }\r
531                 }\r
532                 \r
533                 [WebCategoryAttribute ("Appearance")]\r
534                 [DefaultValueAttribute (GridLines.None)]\r
535                 public virtual GridLines GridLines {\r
536                         get {\r
537                                 if (ControlStyleCreated)\r
538                                         return ((TableStyle) ControlStyle).GridLines;\r
539                                 return GridLines.None;\r
540                         }\r
541                         set {\r
542                                 ((TableStyle) ControlStyle).GridLines = value;\r
543                         }\r
544                 }\r
545 \r
546                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
547                 [BrowsableAttribute (false)]\r
548                 public virtual FormViewRow HeaderRow {\r
549                         get {\r
550                                 EnsureChildControls ();\r
551                                 return headerRow;\r
552                         }\r
553                 }\r
554         \r
555                 [WebCategoryAttribute ("Styles")]\r
556                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
557                 [NotifyParentProperty (true)]\r
558                 [DefaultValue (null)]\r
559                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
560                 public TableItemStyle HeaderStyle {\r
561                         get {\r
562                                 if (headerStyle == null) {\r
563                                         headerStyle = new TableItemStyle ();\r
564                                         if (IsTrackingViewState)\r
565                                                 headerStyle.TrackViewState();\r
566                                 }\r
567                                 return headerStyle;\r
568                         }\r
569                 }\r
570                 \r
571                 [DefaultValue (null)]\r
572                 [TemplateContainer (typeof(FormView), BindingDirection.OneWay)]\r
573                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
574                 [Browsable (false)]\r
575                 public virtual ITemplate HeaderTemplate {\r
576                         get { return headerTemplate; }\r
577                         set { headerTemplate = value; RequireBinding (); }\r
578                 }\r
579 \r
580                 [LocalizableAttribute (true)]\r
581                 [WebCategoryAttribute ("Appearance")]\r
582                 [DefaultValueAttribute ("")]\r
583                 public virtual string HeaderText {\r
584                         get {\r
585                                 object ob = ViewState ["HeaderText"];\r
586                                 if (ob != null) return (string) ob;\r
587                                 return string.Empty;\r
588                         }\r
589                         set {\r
590                                 ViewState ["HeaderText"] = value;\r
591                                 RequireBinding ();\r
592                         }\r
593                 }\r
594                 \r
595                 [Category ("Layout")]\r
596                 [DefaultValueAttribute (HorizontalAlign.NotSet)]\r
597                 public virtual HorizontalAlign HorizontalAlign {\r
598                         get {\r
599                                 if (ControlStyleCreated)\r
600                                         return ((TableStyle) ControlStyle).HorizontalAlign;\r
601                                 return HorizontalAlign.NotSet;\r
602                         }\r
603                         set {\r
604                                 ((TableStyle) ControlStyle).HorizontalAlign = value;\r
605                         }\r
606                 }\r
607 \r
608                 [DefaultValue (null)]\r
609                 [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]\r
610                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
611                 [Browsable (false)]\r
612                 public virtual ITemplate InsertItemTemplate {\r
613                         get { return insertItemTemplate; }\r
614                         set { insertItemTemplate = value; RequireBinding (); }\r
615                 }\r
616 \r
617                 [WebCategoryAttribute ("Styles")]\r
618                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
619                 [NotifyParentProperty (true)]\r
620                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
621                 [DefaultValueAttribute (null)]\r
622                 public TableItemStyle InsertRowStyle {\r
623                         get {\r
624                                 if (insertRowStyle == null) {\r
625                                         insertRowStyle = new TableItemStyle ();\r
626                                         if (IsTrackingViewState)\r
627                                                 insertRowStyle.TrackViewState();\r
628                                 }\r
629                                 return insertRowStyle;\r
630                         }\r
631                 }\r
632 \r
633                 [DefaultValue (null)]\r
634                 [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]\r
635                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
636                 [Browsable (false)]\r
637                 public virtual ITemplate ItemTemplate {\r
638                         get { return itemTemplate; }\r
639                         set { itemTemplate = value; RequireBinding (); }\r
640                 }\r
641                 \r
642                 [BrowsableAttribute (false)]\r
643                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
644                 public virtual int PageCount {\r
645                         get {\r
646                                 if (pageCount != 0) return pageCount;\r
647                                 EnsureDataBound ();\r
648                                 return pageCount;\r
649                         }\r
650                 }\r
651 \r
652                 [WebCategoryAttribute ("Paging")]\r
653                 [BindableAttribute (true, BindingDirection.OneWay)]\r
654                 [DefaultValueAttribute (0)]\r
655                 public virtual int PageIndex {\r
656                         get {\r
657                                 return pageIndex;\r
658                         }\r
659                         set {\r
660                                 if (value < 0)\r
661                                         throw new ArgumentOutOfRangeException ("PageIndex must be non-negative");\r
662                                 if (pageIndex == value)\r
663                                         return;\r
664                                 pageIndex = value;\r
665                                 RequireBinding ();\r
666                         }\r
667                 }\r
668         \r
669                 [WebCategoryAttribute ("Paging")]\r
670                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]\r
671                 [NotifyParentPropertyAttribute (true)]\r
672                 [PersistenceModeAttribute (PersistenceMode.InnerProperty)]\r
673                 public virtual PagerSettings PagerSettings {\r
674                         get {\r
675                                 if (pagerSettings == null) {\r
676                                         pagerSettings = new PagerSettings (this);\r
677                                         if (IsTrackingViewState)\r
678                                                 ((IStateManager)pagerSettings).TrackViewState ();\r
679                                 }\r
680                                 return pagerSettings;\r
681                         }\r
682                 }\r
683         \r
684                 [WebCategoryAttribute ("Styles")]\r
685                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
686                 [NotifyParentProperty (true)]\r
687                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
688                 public TableItemStyle PagerStyle {\r
689                         get {\r
690                                 if (pagerStyle == null) {\r
691                                         pagerStyle = new TableItemStyle ();\r
692                                         if (IsTrackingViewState)\r
693                                                 pagerStyle.TrackViewState();\r
694                                 }\r
695                                 return pagerStyle;\r
696                         }\r
697                 }\r
698                 \r
699                 \r
700                 [DefaultValue (null)]\r
701                 /* DataControlPagerCell isnt specified in the docs */\r
702                 //[TemplateContainer (typeof(DataControlPagerCell), BindingDirection.OneWay)]\r
703                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
704                 [Browsable (false)]\r
705                 public virtual ITemplate PagerTemplate {\r
706                         get { return pagerTemplate; }\r
707                         set { pagerTemplate = value; RequireBinding (); }\r
708                 }\r
709                 \r
710                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
711                 [BrowsableAttribute (false)]\r
712                 public virtual FormViewRow Row {\r
713                         get {\r
714                                 EnsureDataBound ();\r
715                                 return itemRow;\r
716                         }\r
717                 }\r
718                 \r
719                 [WebCategoryAttribute ("Styles")]\r
720                 [PersistenceMode (PersistenceMode.InnerProperty)]\r
721                 [NotifyParentProperty (true)]\r
722                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
723                 [DefaultValue (null)]\r
724                 public TableItemStyle RowStyle {\r
725                         get {\r
726                                 if (rowStyle == null) {\r
727                                         rowStyle = new TableItemStyle ();\r
728                                         if (IsTrackingViewState)\r
729                                                 rowStyle.TrackViewState();\r
730                                 }\r
731                                 return rowStyle;\r
732                         }\r
733                 }\r
734 \r
735                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
736                 [BrowsableAttribute (false)]\r
737                 public object SelectedValue {\r
738                         get { return DataKey.Value; }\r
739                 }\r
740                 \r
741                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
742                 [BrowsableAttribute (false)]\r
743                 public virtual FormViewRow TopPagerRow {\r
744                         get {\r
745                                 EnsureDataBound ();\r
746                                 return topPagerRow;\r
747                         }\r
748                 }\r
749         \r
750                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
751                 [BrowsableAttribute (false)]\r
752                 public virtual object DataItem {\r
753                         get {\r
754                                 EnsureDataBound ();\r
755                                 return dataItem;\r
756                         }\r
757                 }\r
758                 \r
759                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
760                 [BrowsableAttribute (false)]\r
761                 public int DataItemCount {\r
762                         get { return PageCount; }\r
763                 }               \r
764         \r
765                 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
766                 [BrowsableAttribute (false)]\r
767                 public virtual int DataItemIndex {\r
768                         get { return PageIndex; }\r
769                 }\r
770 \r
771                 int IDataItemContainer.DataItemIndex {\r
772                         get { return DataItemIndex; }\r
773                 }\r
774         \r
775                 int IDataItemContainer.DisplayIndex {\r
776                         get { return PageIndex; }\r
777                 }               \r
778         \r
779                 public virtual bool IsBindableType (Type type)\r
780                 {\r
781                         return type.IsPrimitive || type == typeof (string) || type == typeof (DateTime) || type == typeof (Guid) || type == typeof (Decimal);\r
782                 }\r
783                 \r
784                 protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()\r
785                 {\r
786                         DataSourceSelectArguments arg = new DataSourceSelectArguments ();\r
787                         DataSourceView view = GetData ();\r
788                         if (AllowPaging && view.CanPage) {\r
789                                 arg.StartRowIndex = PageIndex;\r
790                                 if (view.CanRetrieveTotalRowCount) {\r
791                                         arg.RetrieveTotalRowCount = true;\r
792                                         arg.MaximumRows = 1;\r
793                                 }\r
794                                 else {\r
795                                         arg.MaximumRows = -1;\r
796                                 }\r
797                         }\r
798                         return arg;\r
799                 }\r
800                 \r
801                 protected virtual FormViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)\r
802                 {\r
803                         FormViewRow row = new FormViewRow (rowIndex, rowType, rowState);\r
804                         OnItemCreated (EventArgs.Empty);\r
805                         return row;\r
806                 }\r
807                 \r
808                 void RequireBinding ()\r
809                 {\r
810                         if (Initialized) {\r
811                                 pageCount = -1;\r
812                                 RequiresDataBinding = true;\r
813                         }\r
814                 }\r
815                 \r
816                 protected virtual Table CreateTable ()\r
817                 {\r
818                         return new ContainedTable (this);\r
819                 }\r
820 \r
821                 [MonoTODO]\r
822                 protected override void EnsureDataBound ()\r
823                 {\r
824                         base.EnsureDataBound ();\r
825                 }\r
826         \r
827                 protected override Style CreateControlStyle ()\r
828                 {\r
829                         TableStyle style = new TableStyle (ViewState);\r
830                         style.CellSpacing = 0;\r
831                         return style;\r
832                 }\r
833                 \r
834                 protected override int CreateChildControls (IEnumerable data, bool dataBinding)\r
835                 {\r
836                         PagedDataSource dataSource = new PagedDataSource ();\r
837                         dataSource.DataSource = data;\r
838                         dataSource.AllowPaging = AllowPaging;\r
839                         dataSource.PageSize = 1;\r
840                         dataSource.CurrentPageIndex = PageIndex;\r
841 \r
842                         if (dataBinding && CurrentMode != FormViewMode.Insert) {\r
843                                 DataSourceView view = GetData ();\r
844                                 if (view != null && view.CanPage) {\r
845                                         dataSource.AllowServerPaging = true;\r
846                                         if (SelectArguments.RetrieveTotalRowCount)\r
847                                                 dataSource.VirtualCount = SelectArguments.TotalRowCount;\r
848                                 }\r
849                         }\r
850 \r
851                         pageCount = dataSource.DataSourceCount;\r
852                         bool showPager = AllowPaging && (pageCount > 1);\r
853                         \r
854                         Controls.Clear ();\r
855                         table = CreateTable ();\r
856                         Controls.Add (table);\r
857 \r
858                         // Gets the current data item\r
859                         \r
860                         IEnumerator e = dataSource.GetEnumerator (); \r
861                         dataItem = null;\r
862 \r
863                         if (AllowPaging) {\r
864                                 if (e.MoveNext ())\r
865                                         dataItem = e.Current;\r
866                         }\r
867                         else\r
868                         for (int page = 0; e.MoveNext (); page++ )\r
869                                 if (page == PageIndex)\r
870                                         dataItem = e.Current;\r
871                         \r
872                         // Main table creation\r
873                         \r
874                         if (HeaderText.Length != 0 || headerTemplate != null) {\r
875                                 headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);\r
876                                 InitializeRow (headerRow);\r
877                                 table.Rows.Add (headerRow);\r
878                         }\r
879                         \r
880                         if (showPager && PagerSettings.Position == PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {\r
881                                 topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);\r
882                                 InitializePager (topPagerRow, dataSource);\r
883                                 table.Rows.Add (topPagerRow);\r
884                         }\r
885 \r
886                         if (pageCount > 0) {\r
887                                 DataControlRowState rstate = GetRowState ();\r
888                                 itemRow = CreateRow (0, DataControlRowType.DataRow, rstate);\r
889                                 InitializeRow (itemRow);\r
890                                 table.Rows.Add (itemRow);\r
891                                 \r
892                                 if (!dataBinding) {\r
893                                         if (CurrentMode == FormViewMode.Edit)\r
894                                                 oldEditValues = new DataKey (new OrderedDictionary ());\r
895                                         key = new DataKey (new OrderedDictionary (), DataKeyNames);\r
896                                 }\r
897                         } else {\r
898                                 switch (CurrentMode) {\r
899                                 case FormViewMode.Edit:\r
900                                         itemRow = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Edit);\r
901                                         break;\r
902                                 case FormViewMode.Insert:\r
903                                         itemRow = CreateRow (-1, DataControlRowType.DataRow, DataControlRowState.Insert);\r
904                                         break;\r
905                                 default:\r
906                                         itemRow = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);\r
907                                         break;\r
908                                 }\r
909                                 table.Rows.Add (itemRow);\r
910                                 InitializeRow (itemRow);\r
911                         }\r
912 \r
913                         if (FooterText.Length != 0 || footerTemplate != null) {\r
914                                 footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);\r
915                                 InitializeRow (footerRow);\r
916                                 table.Rows.Add (footerRow);\r
917                         }\r
918                         \r
919                         if (showPager && PagerSettings.Position == PagerPosition.Bottom || PagerSettings.Position == PagerPosition.TopAndBottom) {\r
920                                 bottomPagerRow = CreateRow (0, DataControlRowType.Pager, DataControlRowState.Normal);\r
921                                 InitializePager (bottomPagerRow, dataSource);\r
922                                 table.Rows.Add (bottomPagerRow);\r
923                         }\r
924 \r
925                         if (dataBinding)\r
926                                 DataBind (false);\r
927                         \r
928                         return dataSource.DataSourceCount;\r
929                 }\r
930                 \r
931                 DataControlRowState GetRowState ()\r
932                 {\r
933                         DataControlRowState rstate = DataControlRowState.Normal;\r
934                         if (CurrentMode == FormViewMode.Edit) rstate |= DataControlRowState.Edit;\r
935                         else if (CurrentMode == FormViewMode.Insert) rstate |= DataControlRowState.Insert;\r
936                         return rstate;\r
937                 }\r
938                 \r
939                 protected virtual void InitializePager (FormViewRow row, PagedDataSource dataSource)\r
940                 {\r
941                         TableCell cell = new TableCell ();\r
942                         cell.ColumnSpan = 2;\r
943 \r
944                         if (pagerTemplate != null)\r
945                                 pagerTemplate.InstantiateIn (cell);\r
946                         else\r
947                                 cell.Controls.Add (PagerSettings.CreatePagerControl (dataSource.CurrentPageIndex, dataSource.PageCount));\r
948                         \r
949                         row.Cells.Add (cell);\r
950                 }\r
951                 \r
952                 protected virtual void InitializeRow (FormViewRow row)\r
953                 {\r
954                         TableCell cell = new TableCell ();\r
955                         \r
956                         if (row.RowType == DataControlRowType.DataRow)\r
957                         {\r
958                                 if ((row.RowState & DataControlRowState.Edit) != 0) {\r
959                                         if (editItemTemplate != null)\r
960                                                 editItemTemplate.InstantiateIn (cell);\r
961                                 } else if ((row.RowState & DataControlRowState.Insert) != 0) {\r
962                                         if (insertItemTemplate != null)\r
963                                                 insertItemTemplate.InstantiateIn (cell);\r
964                                 } else if (itemTemplate != null)\r
965                                         itemTemplate.InstantiateIn (cell);\r
966                         }\r
967                         else if (row.RowType == DataControlRowType.EmptyDataRow)\r
968                         {\r
969                                 if (emptyDataTemplate != null)\r
970                                         emptyDataTemplate.InstantiateIn (cell);\r
971                                 else\r
972                                         cell.Text = EmptyDataText;\r
973                         }\r
974                         else if (row.RowType == DataControlRowType.Footer)\r
975                         {\r
976                                 if (footerTemplate != null)\r
977                                         footerTemplate.InstantiateIn (cell);\r
978                                 else\r
979                                         cell.Text = FooterText;\r
980                         }\r
981                         else if (row.RowType == DataControlRowType.Header)\r
982                         {\r
983                                 if (headerTemplate != null)\r
984                                         headerTemplate.InstantiateIn (cell);\r
985                                 else\r
986                                         cell.Text = HeaderText;\r
987                         }\r
988                         cell.ColumnSpan = 2;\r
989                         row.Cells.Add (cell);\r
990                 }\r
991                 \r
992                 IOrderedDictionary CreateRowDataKey (object dataItem)\r
993                 {\r
994                         if (cachedKeyProperties == null) {\r
995                                 PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);\r
996                                 cachedKeyProperties = new PropertyDescriptor [DataKeyNames.Length];\r
997                                 for (int n=0; n<DataKeyNames.Length; n++) { \r
998                                         PropertyDescriptor p = props [DataKeyNames[n]];\r
999                                         if (p == null)\r
1000                                                 new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());\r
1001                                         cachedKeyProperties [n] = p;\r
1002                                 }\r
1003                         }\r
1004                         \r
1005                         OrderedDictionary dic = new OrderedDictionary ();\r
1006                         foreach (PropertyDescriptor p in cachedKeyProperties)\r
1007                                 dic [p.Name] = p.GetValue (dataItem);\r
1008                         return dic;\r
1009                 }\r
1010                 \r
1011                 IOrderedDictionary GetRowValues (bool includePrimaryKey)\r
1012                 {\r
1013                         OrderedDictionary dic = new OrderedDictionary ();\r
1014                         ExtractRowValues (dic, includePrimaryKey);\r
1015                         return dic;\r
1016                 }\r
1017                 \r
1018                 protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeKeys)\r
1019                 {\r
1020                         if (Row == null)\r
1021                                 return;\r
1022 \r
1023                         DataControlRowState rowState = Row.RowState;\r
1024                         IBindableTemplate bt;\r
1025                         \r
1026                         if ((rowState & DataControlRowState.Insert) != 0)\r
1027                                 bt = insertItemTemplate as IBindableTemplate; \r
1028                         else if ((rowState & DataControlRowState.Edit) != 0)\r
1029                                 bt = editItemTemplate as IBindableTemplate;\r
1030                         else\r
1031                                 return;\r
1032                         \r
1033                         if (bt != null) {\r
1034                                 IOrderedDictionary values = bt.ExtractValues (Row.Cells [0]);\r
1035                                 foreach (DictionaryEntry e in values) {\r
1036                                         if (includeKeys || Array.IndexOf (DataKeyNames, e.Key) == -1)\r
1037                                                 fieldValues [e.Key] = e.Value;\r
1038                                 }\r
1039                         }\r
1040                 }\r
1041                 \r
1042                 protected override HtmlTextWriterTag TagKey {\r
1043                         get {\r
1044                                 return HtmlTextWriterTag.Table;\r
1045                         }\r
1046                 }\r
1047                 \r
1048                 public sealed override void DataBind ()\r
1049                 {\r
1050                         if (CurrentMode == FormViewMode.Insert) {\r
1051                                 RequiresDataBinding = false;\r
1052                                 PerformDataBinding (new object [] { null });\r
1053                                 return;\r
1054                         }\r
1055 \r
1056                         cachedKeyProperties = null;\r
1057                         base.DataBind ();\r
1058                         \r
1059                         if (pageCount > 0) {\r
1060                                 if (CurrentMode == FormViewMode.Edit)\r
1061                                         oldEditValues = new DataKey (GetRowValues (true));\r
1062                                 else\r
1063                                         oldEditValues = new DataKey (new OrderedDictionary ());\r
1064                                 key = new DataKey (CreateRowDataKey (dataItem), DataKeyNames);\r
1065                         }\r
1066                 }\r
1067                 \r
1068                 protected internal override void PerformDataBinding (IEnumerable data)\r
1069                 {\r
1070                         base.PerformDataBinding (data);\r
1071                 }\r
1072 \r
1073                 protected internal virtual void PrepareControlHierarchy ()\r
1074                 {\r
1075                         if (table == null)\r
1076                                 return;\r
1077 \r
1078                         table.Caption = Caption;\r
1079                         table.CaptionAlign = CaptionAlign;\r
1080 \r
1081                         foreach (FormViewRow row in table.Rows) {\r
1082                                 switch (row.RowType) {\r
1083                                 case DataControlRowType.Header:\r
1084                                         if (headerStyle != null && !headerStyle.IsEmpty)\r
1085                                                 row.ControlStyle.CopyFrom (headerStyle);\r
1086                                         break;\r
1087                                 case DataControlRowType.Footer:\r
1088                                         if (footerStyle != null && !footerStyle.IsEmpty)\r
1089                                                 row.ControlStyle.CopyFrom (footerStyle);\r
1090                                         break;\r
1091                                 case DataControlRowType.Pager:\r
1092                                         if (pagerStyle != null && !pagerStyle.IsEmpty)\r
1093                                                 row.ControlStyle.CopyFrom (pagerStyle);\r
1094                                         break;\r
1095                                 case DataControlRowType.EmptyDataRow:\r
1096                                         if (emptyDataRowStyle != null && !emptyDataRowStyle.IsEmpty)\r
1097                                                 row.ControlStyle.CopyFrom (emptyDataRowStyle);\r
1098                                         break;\r
1099                                 case DataControlRowType.DataRow:\r
1100                                         if (rowStyle != null && !rowStyle.IsEmpty)\r
1101                                                 row.ControlStyle.CopyFrom (rowStyle);\r
1102                                         if ((row.RowState & (DataControlRowState.Edit | DataControlRowState.Insert)) != 0 && editRowStyle != null && !editRowStyle.IsEmpty)\r
1103                                                 row.ControlStyle.CopyFrom (editRowStyle);\r
1104                                         if ((row.RowState & DataControlRowState.Insert) != 0 && insertRowStyle != null && !insertRowStyle.IsEmpty)\r
1105                                                 row.ControlStyle.CopyFrom (insertRowStyle);\r
1106                                         break;\r
1107                                 default:\r
1108                                         break;\r
1109                                 }\r
1110                         }\r
1111                 }\r
1112                 \r
1113                 protected internal override void OnInit (EventArgs e)\r
1114                 {\r
1115                         Page.RegisterRequiresControlState (this);\r
1116                         base.OnInit (e);\r
1117                 }\r
1118                 \r
1119                 protected override bool OnBubbleEvent (object source, EventArgs e)\r
1120                 {\r
1121                         FormViewCommandEventArgs args = e as FormViewCommandEventArgs;\r
1122                         if (args != null) {\r
1123                                 OnItemCommand (args);\r
1124                                 ProcessEvent (args.CommandName, args.CommandArgument as string);\r
1125                                 return true;\r
1126                         }\r
1127                         return base.OnBubbleEvent (source, e);\r
1128                 }\r
1129                 \r
1130                 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)\r
1131                 {\r
1132                         RaisePostBackEvent (eventArgument);\r
1133                 }\r
1134 \r
1135                 protected virtual void RaisePostBackEvent (string eventArgument)\r
1136                 {\r
1137                         int i = eventArgument.IndexOf ('$');\r
1138                         if (i != -1)\r
1139                                 ProcessEvent (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));\r
1140                         else\r
1141                                 ProcessEvent (eventArgument, null);\r
1142                 }\r
1143                 \r
1144                 void ProcessEvent (string eventName, string param)\r
1145                 {\r
1146                         switch (eventName)\r
1147                         {\r
1148                         case DataControlCommands.PageCommandName:\r
1149                                 int newIndex = -1;\r
1150                                 switch (param) {\r
1151                                 case DataControlCommands.FirstPageCommandArgument:\r
1152                                         newIndex = 0;\r
1153                                         break;\r
1154                                 case DataControlCommands.LastPageCommandArgument:\r
1155                                         newIndex = PageCount - 1;\r
1156                                         break;\r
1157                                 case DataControlCommands.NextPageCommandArgument:\r
1158                                         newIndex = PageIndex + 1;\r
1159                                         break;\r
1160                                 case DataControlCommands.PreviousPageCommandArgument:\r
1161                                         newIndex = PageIndex - 1;\r
1162                                         break;\r
1163                                 default:\r
1164                                         int paramIndex = 0;\r
1165                                         int.TryParse (param, out paramIndex);\r
1166                                         newIndex = paramIndex - 1;\r
1167                                         break;\r
1168                                 }\r
1169                                 ShowPage (newIndex);\r
1170                                 break;\r
1171                                         \r
1172                         case DataControlCommands.FirstPageCommandArgument:\r
1173                                 ShowPage (0);\r
1174                                 break;\r
1175 \r
1176                         case DataControlCommands.LastPageCommandArgument:\r
1177                                 ShowPage (PageCount - 1);\r
1178                                 break;\r
1179                                         \r
1180                         case DataControlCommands.NextPageCommandArgument:\r
1181                                 if (PageIndex < PageCount - 1)\r
1182                                         ShowPage (PageIndex + 1);\r
1183                                 break;\r
1184 \r
1185                         case DataControlCommands.PreviousPageCommandArgument:\r
1186                                 if (PageIndex > 0)\r
1187                                         ShowPage (PageIndex - 1);\r
1188                                 break;\r
1189                                         \r
1190                         case DataControlCommands.EditCommandName:\r
1191                                 ChangeMode (FormViewMode.Edit);\r
1192                                 break;\r
1193                                         \r
1194                         case DataControlCommands.NewCommandName:\r
1195                                 ChangeMode (FormViewMode.Insert);\r
1196                                 break;\r
1197                                         \r
1198                         case DataControlCommands.UpdateCommandName:\r
1199                                 UpdateItem (param, true);\r
1200                                 break;\r
1201                                         \r
1202                         case DataControlCommands.CancelCommandName:\r
1203                                 CancelEdit ();\r
1204                                 break;\r
1205                                         \r
1206                         case DataControlCommands.DeleteCommandName:\r
1207                                 DeleteItem ();\r
1208                                 break;\r
1209                                         \r
1210                         case DataControlCommands.InsertCommandName:\r
1211                                 InsertItem (true);\r
1212                                 break;\r
1213                         }\r
1214                 }\r
1215                 \r
1216                 void ShowPage (int newIndex)\r
1217                 {\r
1218                         FormViewPageEventArgs args = new FormViewPageEventArgs (newIndex);\r
1219                         OnPageIndexChanging (args);\r
1220                         if (!args.Cancel) {\r
1221                                 newIndex = args.NewPageIndex;\r
1222                                 if (newIndex < 0 || newIndex >= PageCount)\r
1223                                         return;\r
1224                                 EndRowEdit (false);\r
1225                                 PageIndex = newIndex;\r
1226                                 OnPageIndexChanged (EventArgs.Empty);\r
1227                         }\r
1228                 }\r
1229                 \r
1230                 public void ChangeMode (FormViewMode newMode)\r
1231                 {\r
1232                         FormViewModeEventArgs args = new FormViewModeEventArgs (newMode, false);\r
1233                         OnModeChanging (args);\r
1234                         if (!args.Cancel) {\r
1235                                 CurrentMode = args.NewMode;\r
1236                                 OnModeChanged (EventArgs.Empty);\r
1237                                 RequireBinding ();\r
1238                         }\r
1239                 }\r
1240                 \r
1241                 void CancelEdit ()\r
1242                 {\r
1243                         FormViewModeEventArgs args = new FormViewModeEventArgs (FormViewMode.ReadOnly, true);\r
1244                         OnModeChanging (args);\r
1245                         if (!args.Cancel) {\r
1246                                 EndRowEdit ();\r
1247                         }\r
1248                 }\r
1249 \r
1250                 public virtual void UpdateItem (bool causesValidation)\r
1251                 {\r
1252                         UpdateItem (null, causesValidation);\r
1253                 }\r
1254                 \r
1255                 void UpdateItem (string param, bool causesValidation)\r
1256                 {\r
1257                         if (causesValidation && Page != null)\r
1258                                 Page.Validate ();\r
1259                         \r
1260                         if (currentMode != FormViewMode.Edit) throw new HttpException ("Must be in Edit mode");\r
1261                         \r
1262                         if (oldEditValues == null)\r
1263                                 currentEditOldValues = new OrderedDictionary ();\r
1264                         else\r
1265                                 currentEditOldValues = oldEditValues.Values;\r
1266                         currentEditRowKeys = DataKey.Values;\r
1267                         currentEditNewValues = GetRowValues (false);\r
1268                         \r
1269                         FormViewUpdateEventArgs args = new FormViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);\r
1270                         OnItemUpdating (args);\r
1271                         if (!args.Cancel) {\r
1272                                 DataSourceView view = GetData ();\r
1273                                 if (view == null)\r
1274                                         throw new HttpException ("The DataSourceView associated to data bound control was null");\r
1275                                 if (view.CanUpdate)\r
1276                                         view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));\r
1277                         }\r
1278                         else\r
1279                                 EndRowEdit ();\r
1280                 }\r
1281 \r
1282                 bool UpdateCallback (int recordsAffected, Exception exception)\r
1283                 {\r
1284                         FormViewUpdatedEventArgs dargs = new FormViewUpdatedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditOldValues, currentEditNewValues);\r
1285                         OnItemUpdated (dargs);\r
1286 \r
1287                         if (!dargs.KeepInEditMode)                              \r
1288                                 EndRowEdit ();\r
1289 \r
1290                         return dargs.ExceptionHandled;\r
1291                 }\r
1292 \r
1293                 public virtual void InsertItem (bool causesValidation)\r
1294                 {\r
1295                         InsertItem (null, causesValidation);\r
1296                 }\r
1297                 \r
1298                 void InsertItem (string param, bool causesValidation)\r
1299                 {\r
1300                         if (causesValidation && Page != null)\r
1301                                 Page.Validate ();\r
1302                         \r
1303                         if (currentMode != FormViewMode.Insert) throw new HttpException ("Must be in Insert mode");\r
1304                         \r
1305                         currentEditNewValues = GetRowValues (true);\r
1306                         FormViewInsertEventArgs args = new FormViewInsertEventArgs (param, currentEditNewValues);\r
1307                         OnItemInserting (args);\r
1308                         if (!args.Cancel) {\r
1309                                 DataSourceView view = GetData ();\r
1310                                 if (view == null)\r
1311                                         throw new HttpException ("The DataSourceView associated to data bound control was null");\r
1312                                 if (view.CanInsert)\r
1313                                         view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));\r
1314                         }\r
1315                         else\r
1316                                 EndRowEdit ();\r
1317                 }\r
1318                 \r
1319                 bool InsertCallback (int recordsAffected, Exception exception)\r
1320                 {\r
1321                         FormViewInsertedEventArgs dargs = new FormViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);\r
1322                         OnItemInserted (dargs);\r
1323 \r
1324                         if (!dargs.KeepInInsertMode)                            \r
1325                                 EndRowEdit ();\r
1326 \r
1327                         return dargs.ExceptionHandled;\r
1328                 }\r
1329 \r
1330                 public virtual void DeleteItem ()\r
1331                 {\r
1332                         currentEditRowKeys = DataKey.Values;\r
1333                         currentEditNewValues = GetRowValues (true);\r
1334                         \r
1335                         FormViewDeleteEventArgs args = new FormViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);\r
1336                         OnItemDeleting (args);\r
1337 \r
1338                         if (!args.Cancel) {\r
1339                                 if (PageIndex > 0 && PageIndex == PageCount - 1)\r
1340                                         PageIndex--;\r
1341                                         \r
1342                                 RequireBinding ();\r
1343                                         \r
1344                                 DataSourceView view = GetData ();\r
1345                                 if (view != null && view.CanDelete)\r
1346                                         view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));\r
1347                                 else {\r
1348                                         FormViewDeletedEventArgs dargs = new FormViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);\r
1349                                         OnItemDeleted (dargs);\r
1350                                 }\r
1351                         }\r
1352                 }\r
1353 \r
1354                 bool DeleteCallback (int recordsAffected, Exception exception)\r
1355                 {\r
1356                         FormViewDeletedEventArgs dargs = new FormViewDeletedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditNewValues);\r
1357                         OnItemDeleted (dargs);\r
1358                         return dargs.ExceptionHandled;\r
1359                 }\r
1360                 \r
1361                 void EndRowEdit ()\r
1362                 {\r
1363                         EndRowEdit (true);\r
1364                 }\r
1365 \r
1366                 void EndRowEdit (bool switchToDefaultMode) \r
1367                 {\r
1368                         if (switchToDefaultMode)\r
1369                                 ChangeMode (DefaultMode);\r
1370                         oldEditValues = new DataKey (new OrderedDictionary ());\r
1371                         currentEditRowKeys = null;\r
1372                         currentEditOldValues = null;\r
1373                         currentEditNewValues = null;\r
1374                         RequireBinding ();\r
1375                 }\r
1376 \r
1377                 protected internal override void LoadControlState (object ob)\r
1378                 {\r
1379                         if (ob == null) return;\r
1380                         object[] state = (object[]) ob;\r
1381                         base.LoadControlState (state[0]);\r
1382                         pageIndex = (int) state[1];\r
1383                         pageCount = (int) state[2];\r
1384                         CurrentMode = (FormViewMode) state[3];\r
1385                         defaultMode = (FormViewMode) state[4];\r
1386                         dataKeyNames = (string[]) state[5];\r
1387                 }\r
1388                 \r
1389                 protected internal override object SaveControlState ()\r
1390                 {\r
1391                         object bstate = base.SaveControlState ();\r
1392                         return new object[] {\r
1393                                 bstate, pageIndex, pageCount, CurrentMode, defaultMode, dataKeyNames\r
1394                         };\r
1395                 }\r
1396                 \r
1397                 protected override void TrackViewState()\r
1398                 {\r
1399                         base.TrackViewState();\r
1400                         if (pagerSettings != null) ((IStateManager)pagerSettings).TrackViewState();\r
1401                         if (footerStyle != null) ((IStateManager)footerStyle).TrackViewState();\r
1402                         if (headerStyle != null) ((IStateManager)headerStyle).TrackViewState();\r
1403                         if (pagerStyle != null) ((IStateManager)pagerStyle).TrackViewState();\r
1404                         if (rowStyle != null) ((IStateManager)rowStyle).TrackViewState();\r
1405                         if (editRowStyle != null) ((IStateManager)editRowStyle).TrackViewState();\r
1406                         if (insertRowStyle != null) ((IStateManager)insertRowStyle).TrackViewState();\r
1407                         if (emptyDataRowStyle != null) ((IStateManager)emptyDataRowStyle).TrackViewState();\r
1408                         if (key != null) ((IStateManager)key).TrackViewState();\r
1409                 }\r
1410 \r
1411                 protected override object SaveViewState()\r
1412                 {\r
1413                         object[] states = new object [14];\r
1414                         states[0] = base.SaveViewState();\r
1415                         states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).SaveViewState());\r
1416                         states[4] = (footerStyle == null ? null : ((IStateManager)footerStyle).SaveViewState());\r
1417                         states[5] = (headerStyle == null ? null : ((IStateManager)headerStyle).SaveViewState());\r
1418                         states[6] = (pagerStyle == null ? null : ((IStateManager)pagerStyle).SaveViewState());\r
1419                         states[7] = (rowStyle == null ? null : ((IStateManager)rowStyle).SaveViewState());\r
1420                         states[8] = (insertRowStyle == null ? null : ((IStateManager)insertRowStyle).SaveViewState());\r
1421                         states[9] = (editRowStyle == null ? null : ((IStateManager)editRowStyle).SaveViewState());\r
1422                         states[10] = (emptyDataRowStyle == null ? null : ((IStateManager)emptyDataRowStyle).SaveViewState());\r
1423                         states[11] = (key == null ? null : ((IStateManager)key).SaveViewState());\r
1424                         states[12] = (oldEditValues == null ? null : ((IStateManager)oldEditValues).SaveViewState());\r
1425                         \r
1426                         for (int i = states.Length - 1; i >= 0; i--) {\r
1427                                 if (states [i] != null)\r
1428                                         return states;\r
1429                         }\r
1430 \r
1431                         return null;\r
1432                 }\r
1433 \r
1434                 protected override void LoadViewState (object savedState)\r
1435                 {\r
1436                         if (savedState == null) {\r
1437                                 base.LoadViewState (null);\r
1438                                 return;\r
1439                         }\r
1440 \r
1441                         object [] states = (object []) savedState;\r
1442                         \r
1443                         base.LoadViewState (states[0]);\r
1444                         EnsureChildControls ();\r
1445                         \r
1446                         if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);\r
1447                         if (states[4] != null) ((IStateManager)FooterStyle).LoadViewState (states[4]);\r
1448                         if (states[5] != null) ((IStateManager)HeaderStyle).LoadViewState (states[5]);\r
1449                         if (states[6] != null) ((IStateManager)PagerStyle).LoadViewState (states[6]);\r
1450                         if (states[7] != null) ((IStateManager)RowStyle).LoadViewState (states[7]);\r
1451                         if (states[8] != null) ((IStateManager)InsertRowStyle).LoadViewState (states[8]);\r
1452                         if (states[9] != null) ((IStateManager)EditRowStyle).LoadViewState (states[9]);\r
1453                         if (states[10] != null) ((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);\r
1454                         if (states[11] != null && DataKey != null) ((IStateManager)DataKey).LoadViewState (states[11]);\r
1455                         if (states[12] != null && oldEditValues != null) ((IStateManager)oldEditValues).LoadViewState (states[12]);\r
1456                 }\r
1457                 \r
1458                 protected internal override void Render (HtmlTextWriter writer)\r
1459                 {\r
1460                         PrepareControlHierarchy ();\r
1461                         \r
1462                         if (table == null)\r
1463                                 return;\r
1464 \r
1465                         table.Render (writer);\r
1466                 }\r
1467 \r
1468                 PostBackOptions IPostBackContainer.GetPostBackOptions (IButtonControl control)\r
1469                 {\r
1470                         if (control == null)\r
1471                                 throw new ArgumentNullException ("control");\r
1472 \r
1473                         if (control.CausesValidation)\r
1474                                 throw new InvalidOperationException ("A button that causes validation in FormView '" + ID + "' is attempting to use the container GridView as the post back target.  The button should either turn off validation or use itself as the post back container.");\r
1475 \r
1476                         PostBackOptions options = new PostBackOptions (this);\r
1477                         options.Argument = control.CommandName + "$" + control.CommandArgument;\r
1478                         options.RequiresJavaScriptProtocol = true;\r
1479 \r
1480                         return options;\r
1481                 }\r
1482 \r
1483         }\r
1484 }\r
1485 \r
1486 #endif\r