[resgen] Implement conditional resources (#if/#ifdef)
[mono.git] / mcs / class / System.Web / Test / System.Web.UI.WebControls / DataGridTest.cs
1 //
2 // Tests for System.Web.UI.WebControls.DataGrid.cs 
3 //
4 // Author:
5 //      Jackson Harper (jackson@ximian.com)
6 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 //
8 //
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using NUnit.Framework;
32 using AttributeCollection = System.ComponentModel.AttributeCollection;
33 using System;
34 using System.Drawing;
35 using System.IO;
36 using System.Globalization;
37 using System.Web;
38 using System.Web.UI;
39 using System.Web.UI.WebControls;
40 using System.Collections;
41 using System.Data;
42 using System.ComponentModel;
43 using System.Diagnostics;
44 using System.Collections.Generic;
45 using MonoTests.SystemWeb.Framework;
46 using MonoTests.stand_alone.WebHarness;
47
48 namespace MonoTests.System.Web.UI.WebControls {
49
50         public class DataGridPoker : DataGrid {
51
52                 public DataGridPoker ()
53                 {
54                         TrackViewState ();
55                 }
56
57                 public string GetTagName ()
58                 {
59                         return TagName;
60                 }
61
62                 public void PrepareCH ()
63                 {
64                         PrepareControlHierarchy ();
65                 }
66
67                 public string Render ()
68                 {
69                         StringWriter sw = new StringWriter ();
70                         HtmlTextWriter tw = new HtmlTextWriter (sw);
71
72                         Render (tw);
73                         return sw.ToString ();
74                 }
75
76                 public StateBag GetViewState ()
77                 {
78                         return ViewState;
79                 }
80
81                 public new Style ControlStyle ()
82                 {
83                         return CreateControlStyle ();
84                 }
85
86                 public void DoCancelCommand (DataGridCommandEventArgs e)
87                 {
88                         OnCancelCommand (e);
89                 }
90
91                 public void DoDeleteCommand (DataGridCommandEventArgs e)
92                 {
93                         OnDeleteCommand (e);
94                 }
95
96                 public void DoEditCommand (DataGridCommandEventArgs e)
97                 {
98                         OnEditCommand (e);
99                 }
100
101                 public void DoItemCommand (DataGridCommandEventArgs e)
102                 {
103                         OnItemCommand (e);
104                 }
105
106                 public void DoUpdateCommand (DataGridCommandEventArgs e)
107                 {
108                         OnUpdateCommand (e);
109                 }
110
111                 public void DoItemCreated (DataGridItemEventArgs e)
112                 {
113                         OnItemCreated (e);
114                 }
115
116                 public void DoItemDataBound (DataGridItemEventArgs e)
117                 {
118                         OnItemDataBound (e);
119                 }
120
121                 public void DoPageIndexChanged (DataGridPageChangedEventArgs e)
122                 {
123                         OnPageIndexChanged (e);
124                 }
125
126                 public void DoSortCommand (DataGridSortCommandEventArgs e)
127                 {
128                         OnSortCommand (e);
129                 }
130
131                 public void DoBubbleEvent (object source, EventArgs e)
132                 {
133                         OnBubbleEvent (source, e);
134                 }
135
136                 public void TrackState ()
137                 {
138                         TrackViewState ();
139                 }
140
141                 public object SaveState ()
142                 {
143                         return SaveViewState ();
144                 }
145
146                 public ArrayList CreateColumns (PagedDataSource data_source, bool use_data_source)
147                 {
148                         return CreateColumnSet (data_source, use_data_source);
149                 }
150
151                 public void CreateControls (bool use_data_source)
152                 {
153                         CreateControlHierarchy (use_data_source);
154                 }
155
156                 public void InitPager (DataGridItem item, int columnSpan,
157                                 PagedDataSource pagedDataSource)
158                 {
159                         InitializePager (item, columnSpan, pagedDataSource);
160                 }
161         }
162
163         public class AmazingEnumerable : IEnumerable {
164
165                 private IList list;
166                 public int CallCount;
167
168                 public AmazingEnumerable (IList list)
169                 {
170                         this.list = list;
171                 }
172
173                 public IEnumerator GetEnumerator ()
174                 {
175                         CallCount++;
176                         return list.GetEnumerator ();
177                 }
178                 
179         }
180
181         [TestFixture]
182         public class DataGridTest {
183
184                 [TestFixtureSetUp()]
185                 public void FixtureSetup () 
186                 {
187                         WebTest.CopyResource (GetType (), "DataGrid.aspx", "DataGrid.aspx");
188                 }
189
190                 [TestFixtureTearDown()]
191                 public void FixtureTearDown () 
192                 {
193                         WebTest.Unload ();
194                 }
195
196                 [Test]
197                 public void Defaults ()
198                 {
199                         DataGridPoker p = new DataGridPoker ();
200
201                         Assert.AreEqual (DataGrid.CancelCommandName, "Cancel", "A1");
202                         Assert.AreEqual (DataGrid.DeleteCommandName, "Delete", "A2");
203                         Assert.AreEqual (DataGrid.EditCommandName, "Edit", "A3");
204                         Assert.AreEqual (DataGrid.NextPageCommandArgument, "Next", "A4");
205                         Assert.AreEqual (DataGrid.PageCommandName, "Page", "A5");
206                         Assert.AreEqual (DataGrid.PrevPageCommandArgument, "Prev", "A6");
207                         Assert.AreEqual (DataGrid.SelectCommandName, "Select", "A7");
208                         Assert.AreEqual (DataGrid.SortCommandName, "Sort", "A8");
209                         Assert.AreEqual (DataGrid.UpdateCommandName, "Update", "A9");
210
211                         Assert.AreEqual (p.AllowCustomPaging, false, "A10");
212                         Assert.AreEqual (p.AllowPaging, false, "A11");
213                         Assert.AreEqual (p.AllowSorting, false, "A12");
214                         Assert.AreEqual (p.AutoGenerateColumns, true, "A13");
215                         Assert.AreEqual (p.BackImageUrl, String.Empty, "A14");
216                         Assert.AreEqual (p.CurrentPageIndex, 0, "A15");
217                         Assert.AreEqual (p.EditItemIndex, -1, "A16");
218                         Assert.AreEqual (p.PageCount, 0, "A17");
219                         Assert.AreEqual (p.PageSize, 10, "A18");
220                         Assert.AreEqual (p.SelectedIndex, -1, "A19");
221                         Assert.AreEqual (p.SelectedItem, null, "A20");
222                         Assert.AreEqual (p.ShowFooter, false, "A21");
223                         Assert.AreEqual (p.ShowHeader, true, "A22");
224                         Assert.AreEqual (p.VirtualItemCount, 0, "A23");
225                 }
226
227                 [Test]
228                 public void TagName ()
229                 {
230                         DataGridPoker p = new DataGridPoker ();
231                         Assert.AreEqual (p.GetTagName (), "table", "A1");
232                 }
233
234                 [Test]
235                 [ExpectedException (typeof (ArgumentNullException))]
236                 public void NullBackImage ()
237                 {
238                         DataGridPoker p = new DataGridPoker ();
239
240                         p.BackImageUrl = null;
241                         Assert.AreEqual (p.BackImageUrl, String.Empty, "A1");
242                 }
243
244                 [Test]
245                 public void CleanProperties ()
246                 {
247                         DataGridPoker p = new DataGridPoker ();
248
249                         p.AllowCustomPaging = true;
250                         Assert.IsTrue (p.AllowCustomPaging, "A1");
251                         p.AllowCustomPaging = false;
252                         Assert.IsFalse (p.AllowCustomPaging, "A2");
253
254                         p.AllowPaging = true;
255                         Assert.IsTrue (p.AllowPaging, "A3");
256                         p.AllowPaging = false;
257                         Assert.IsFalse (p.AllowPaging, "A4");
258
259                         p.AllowSorting = true;
260                         Assert.IsTrue (p.AllowSorting, "A5");
261                         p.AllowSorting = false;
262                         Assert.IsFalse (p.AllowSorting, "A6");
263
264                         p.AutoGenerateColumns = true;
265                         Assert.IsTrue (p.AutoGenerateColumns, "A7");
266                         p.AutoGenerateColumns = false;
267                         Assert.IsFalse (p.AutoGenerateColumns, "A8");
268
269                         p.BackImageUrl = "foobar";
270                         Assert.AreEqual (p.BackImageUrl, "foobar", "A9");
271
272                         p.CurrentPageIndex = 0;
273                         Assert.AreEqual (p.CurrentPageIndex, 0, "A10");
274                         p.CurrentPageIndex = Int32.MaxValue;
275                         Assert.AreEqual (p.CurrentPageIndex, Int32.MaxValue, "A11");
276
277                         p.EditItemIndex = 0;
278                         Assert.AreEqual (p.EditItemIndex, 0, "A12");
279                         p.EditItemIndex = -1;
280                         Assert.AreEqual (p.EditItemIndex, -1, "A13");
281                         p.EditItemIndex = Int32.MaxValue;
282                         Assert.AreEqual (p.EditItemIndex, Int32.MaxValue, "A14");
283
284                         p.PageSize = 1;
285                         Assert.AreEqual (p.PageSize, 1, "A15");
286                         p.PageSize = Int32.MaxValue;
287
288                         p.SelectedIndex = 0;
289                         Assert.AreEqual (p.SelectedIndex, 0, "A16");
290                         p.SelectedIndex = -1;
291                         Assert.AreEqual (p.SelectedIndex, -1, "A17");
292                         p.SelectedIndex = Int32.MaxValue;
293                         Assert.AreEqual (p.SelectedIndex, Int32.MaxValue, "A18");
294
295                         p.ShowFooter = true;
296                         Assert.IsTrue (p.ShowFooter, "A19");
297                         p.ShowFooter = false;
298                         Assert.IsFalse (p.ShowFooter, "A20");
299
300                         p.ShowHeader = true;
301                         Assert.IsTrue (p.ShowHeader, "A21");
302                         p.ShowHeader = false;
303                         Assert.IsFalse (p.ShowHeader, "A22");
304
305                         p.VirtualItemCount = 0;
306                         Assert.AreEqual (p.VirtualItemCount, 0, "A23");
307                         p.VirtualItemCount = Int32.MaxValue;
308                         Assert.AreEqual (p.VirtualItemCount, Int32.MaxValue, "A24");
309                 }
310
311                 [Test]
312                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
313                 public void CurrentPageIndexTooLow ()
314                 {
315                         DataGridPoker p = new DataGridPoker ();
316                         p.CurrentPageIndex = -1;
317                 }
318
319                 [Test]
320                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
321                 public void EditItemIndexTooLow ()
322                 {
323                         DataGridPoker p = new DataGridPoker ();
324                         p.EditItemIndex = -2;
325                 }
326
327                 [Test]
328                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
329                 public void PageSizeTooLow ()
330                 {
331                         DataGridPoker p = new DataGridPoker ();
332                         p.PageSize = 0;
333                 }
334
335                 [Test]
336                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
337                 public void SelectedIndexTooLow ()
338                 {
339                         DataGridPoker p = new DataGridPoker ();
340                         p.SelectedIndex = -2;
341                 }
342
343                 [Test]
344                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
345                 public void VirtualItemCountTooLow ()
346                 {
347                         DataGridPoker p = new DataGridPoker ();
348                         p.VirtualItemCount = -1;
349                 }
350                         
351                 [Test]
352                 public void ViewState ()
353                 {
354                         DataGridPoker p = new DataGridPoker ();
355                         StateBag vs = p.GetViewState ();
356
357                         Assert.AreEqual (vs.Count, 0, "A1");
358
359                         p.AllowCustomPaging = true;
360                         Assert.AreEqual (vs.Count, 1, "A2");
361                         Assert.AreEqual (vs ["AllowCustomPaging"], true, "A3");
362                         p.AllowCustomPaging = false;
363                         Assert.AreEqual (vs.Count, 1, "A4");
364                         Assert.AreEqual (vs ["AllowCustomPaging"], false, "A5");
365
366                         p.AllowPaging = true;
367                         Assert.AreEqual (vs.Count, 2, "A6");
368                         Assert.AreEqual (vs ["AllowPaging"], true, "A7");
369                         p.AllowPaging = false;
370                         Assert.AreEqual (vs.Count, 2, "A8");
371                         Assert.AreEqual (vs ["AllowPaging"], false, "A9");
372
373                         p.AllowSorting = true;
374                         Assert.AreEqual (vs.Count, 3, "A10");
375                         Assert.AreEqual (vs ["AllowSorting"], true, "A11");
376                         p.AllowSorting = false;
377                         Assert.AreEqual (vs.Count, 3, "A12");
378                         Assert.AreEqual (vs ["AllowSorting"], false, "A13");
379
380                         p.AutoGenerateColumns = true;
381                         Assert.AreEqual (vs.Count, 4, "A14");
382                         Assert.AreEqual (vs ["AutoGenerateColumns"], true, "A15");
383                         p.AutoGenerateColumns = false;
384                         Assert.AreEqual (vs.Count, 4, "A16");
385                         Assert.AreEqual (vs ["AutoGenerateColumns"], false, "A17");
386
387                         p.CurrentPageIndex = 1;
388                         Assert.AreEqual (vs.Count, 5, "A18");
389                         Assert.AreEqual (vs ["CurrentPageIndex"], 1, "A19");
390
391                         p.EditItemIndex = 1;
392                         Assert.AreEqual (vs.Count, 6, "A20");
393                         Assert.AreEqual (vs ["EditItemIndex"], 1, "A20");
394
395                         p.PageSize = 25;
396                         Assert.AreEqual (vs.Count, 7, "A21");
397                         Assert.AreEqual (vs ["PageSize"], 25, "A22");
398
399                         p.SelectedIndex = 25;
400                         Assert.AreEqual (vs.Count, 8, "A23");
401                         Assert.AreEqual (vs ["SelectedIndex"], 25, "A24");
402
403                         p.ShowFooter = false;
404                         Assert.AreEqual (vs.Count, 9, "A25");
405                         Assert.AreEqual (vs ["ShowFooter"], false, "A26");
406                         p.ShowFooter = true;
407                         Assert.AreEqual (vs ["ShowFooter"], true, "A27");
408
409                         p.ShowHeader = false;
410                         Assert.AreEqual (vs.Count, 10, "A28");
411                         Assert.AreEqual (vs ["ShowHeader"], false, "A29");
412                         p.ShowHeader = true;
413                         Assert.AreEqual (vs ["ShowHeader"], true, "A30");
414
415                         p.VirtualItemCount = 100;
416                         Assert.AreEqual (vs.Count, 11, "A31");
417                         Assert.AreEqual (vs ["VirtualItemCount"], 100, "A32");
418                 }
419
420                 [Test]
421                 public void SelectIndexOutOfRange ()
422                 {
423                         DataGridPoker p = new DataGridPoker ();
424
425                         // No exception is thrown
426                         p.SelectedIndex = 25;
427                 }
428
429                 [Test]
430                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
431                 public void SelectItemOutOfRange ()
432                 {
433                         DataGridPoker p = new DataGridPoker ();
434                         DataGridItem d;
435
436                         p.SelectedIndex = 25;
437                         d = p.SelectedItem;
438                 }
439
440                 [Test]
441                 public void ControlStyle ()
442                 {
443                         DataGridPoker p = new DataGridPoker ();
444
445                         Assert.AreEqual (p.ControlStyle ().GetType (),
446                                         typeof (TableStyle), "A1");
447
448                         TableStyle t = (TableStyle) p.ControlStyle ();
449                         Assert.AreEqual (t.GridLines, GridLines.Both, "A2");
450                         Assert.AreEqual (t.CellSpacing, 0, "A3");
451                 }
452
453                 [Test]
454                 public void Styles ()
455                 {
456                         DataGridPoker p = new DataGridPoker ();
457                         StateBag vs = p.GetViewState ();
458                         
459                         p.BackImageUrl = "foobar url";
460
461                         // The styles get stored in the view state
462                         Assert.AreEqual (vs.Count, 0, "A1");
463                         Assert.IsNull (vs ["BackImageUrl"], "A2");
464                         Assert.IsNull (vs ["GridLines"], "A3");
465                         Assert.IsNull (vs ["CellSpacing"], "A4");
466                 }
467
468                 private bool cancel_command;
469                 private bool delete_command;
470                 private bool edit_command;
471                 private bool item_command;
472                 private bool update_command;
473                 private bool item_created;
474                 private bool item_data_bound;
475                 private bool page_index_changed;
476                 private bool sort_command;
477                 private bool selected_changed;
478
479                 private int new_page_index;
480
481                 private void ResetEvents ()
482                 {
483                         cancel_command =
484                         delete_command =
485                         edit_command =
486                         item_command =
487                         update_command =
488                         item_created = 
489                         item_data_bound = 
490                         page_index_changed =
491                         sort_command =
492                         selected_changed = false;
493
494                         new_page_index = Int32.MinValue;
495                 }
496                                 
497                 private void CancelCommandHandler (object sender, DataGridCommandEventArgs e)
498                 {
499                         cancel_command = true;
500                 }
501
502                 private void DeleteCommandHandler (object sender, DataGridCommandEventArgs e)
503                 {
504                         delete_command = true;
505                 }
506                 
507                 private void EditCommandHandler (object sender, DataGridCommandEventArgs e)
508                 {
509                         edit_command = true;
510                 }
511
512                 private void ItemCommandHandler (object sender, DataGridCommandEventArgs e)
513                 {
514                         item_command = true;
515                 }
516
517                 private void UpdateCommandHandler (object sender, DataGridCommandEventArgs e)
518                 {
519                         update_command = true;
520                 }
521
522                 private void ItemCreatedHandler (object sender, DataGridItemEventArgs e)
523                 {
524                         item_created = true;
525                 }
526
527                 private void ItemDataBoundHandler (object sender, DataGridItemEventArgs e)
528                 {
529                         item_data_bound = true;
530                 }
531                 
532                 private void PageIndexChangedHandler (object sender, DataGridPageChangedEventArgs e)
533                 {
534                         page_index_changed = true;
535                         new_page_index = e.NewPageIndex;
536                 }
537                 
538                 private void SortCommandHandler (object sender, DataGridSortCommandEventArgs e)
539                 {
540                         sort_command = true;
541                 }
542
543                 private void SelectedIndexChangedHandler (object sender, EventArgs e)
544                 {
545                         selected_changed = true;
546                 }
547
548                 [Test]
549                 public void Events ()
550                 {
551                         DataGridPoker p = new DataGridPoker ();
552                         DataGridCommandEventArgs command_args = new DataGridCommandEventArgs (null,
553                                         null, new CommandEventArgs (String.Empty, String.Empty));
554                         DataGridItemEventArgs item_args = new DataGridItemEventArgs (null);
555                         DataGridPageChangedEventArgs page_args = new DataGridPageChangedEventArgs (null, 0);
556                         DataGridSortCommandEventArgs sort_args = new DataGridSortCommandEventArgs (null,
557                                         command_args);
558
559                         ResetEvents ();
560                         p.CancelCommand += new DataGridCommandEventHandler (CancelCommandHandler);
561                         p.DoCancelCommand (command_args);
562                         Assert.IsTrue (cancel_command, "A1");
563
564                         ResetEvents ();
565                         p.DeleteCommand += new DataGridCommandEventHandler (DeleteCommandHandler);
566                         p.DoDeleteCommand (command_args);
567                         Assert.IsTrue (delete_command, "A2");
568
569                         ResetEvents ();
570                         p.EditCommand += new DataGridCommandEventHandler (EditCommandHandler);
571                         p.DoEditCommand (command_args);
572                         Assert.IsTrue (edit_command, "A3");
573
574                         ResetEvents ();
575                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
576                         p.DoItemCommand (command_args);
577                         Assert.IsTrue (item_command, "A4");
578
579                         ResetEvents ();
580                         p.UpdateCommand += new DataGridCommandEventHandler (UpdateCommandHandler);
581                         p.DoUpdateCommand (command_args);
582                         Assert.IsTrue (update_command, "A5");
583
584                         ResetEvents ();
585                         p.ItemCreated += new DataGridItemEventHandler (ItemCreatedHandler);
586                         p.DoItemCreated (item_args);
587                         Assert.IsTrue (item_created, "A6");
588
589                         ResetEvents ();
590                         p.ItemDataBound += new DataGridItemEventHandler (ItemDataBoundHandler);
591                         p.DoItemDataBound (item_args);
592                         Assert.IsTrue (item_data_bound, "A7");
593
594                         ResetEvents ();
595                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
596                         p.DoPageIndexChanged (page_args);
597                         Assert.IsTrue (page_index_changed, "A8");
598
599                         ResetEvents ();
600                         p.SortCommand += new DataGridSortCommandEventHandler (SortCommandHandler);
601                         p.DoSortCommand (sort_args);
602                         Assert.IsTrue (sort_command, "A9");
603                 }
604
605                 [Test]
606                 public void BubbleEvent ()
607                 {
608                         DataGridPoker p = new DataGridPoker ();
609                         DataGridCommandEventArgs command_args;
610
611                         //
612                         // Cancel
613                         //
614                         ResetEvents ();
615                         command_args = new DataGridCommandEventArgs (null,
616                                         null, new CommandEventArgs ("Cancel", String.Empty));
617                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
618                         p.CancelCommand += new DataGridCommandEventHandler (CancelCommandHandler);
619                         p.DoBubbleEvent (this, command_args);
620                         Assert.IsTrue (cancel_command, "A1");
621                         Assert.IsTrue (item_command, "#01");
622
623                         ResetEvents ();
624                         command_args = new DataGridCommandEventArgs (null,
625                                         null, new CommandEventArgs ("cancel", String.Empty));
626                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
627                         p.CancelCommand += new DataGridCommandEventHandler (CancelCommandHandler);
628                         p.DoBubbleEvent (this, command_args);
629                         Assert.IsTrue (cancel_command, "A2");
630                         Assert.IsTrue (item_command, "#02");
631
632                         ResetEvents ();
633                         command_args = new DataGridCommandEventArgs (null,
634                                         null, new CommandEventArgs ("CANCEL", String.Empty));
635                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
636                         p.CancelCommand += new DataGridCommandEventHandler (CancelCommandHandler);
637                         p.DoBubbleEvent (this, command_args);
638                         Assert.IsTrue (cancel_command, "A3");
639                         Assert.IsTrue (item_command, "#03");
640
641                         //
642                         // Delete
643                         //
644                         ResetEvents ();
645                         command_args = new DataGridCommandEventArgs (null,
646                                         null, new CommandEventArgs ("Delete", String.Empty));
647                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
648                         p.DeleteCommand += new DataGridCommandEventHandler (DeleteCommandHandler);
649                         p.DoBubbleEvent (this, command_args);
650                         Assert.IsTrue (delete_command, "A4");
651                         Assert.IsTrue (item_command, "#04");
652
653                         ResetEvents ();
654                         command_args = new DataGridCommandEventArgs (null,
655                                         null, new CommandEventArgs ("delete", String.Empty));
656                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
657                         p.DeleteCommand += new DataGridCommandEventHandler (DeleteCommandHandler);
658                         p.DoBubbleEvent (this, command_args);
659                         Assert.IsTrue (delete_command, "A5");
660                         Assert.IsTrue (item_command, "#05");
661
662                         ResetEvents ();
663                         command_args = new DataGridCommandEventArgs (null,
664                                         null, new CommandEventArgs ("DELETE", String.Empty));
665                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
666                         p.DeleteCommand += new DataGridCommandEventHandler (DeleteCommandHandler);
667                         p.DoBubbleEvent (this, command_args);
668                         Assert.IsTrue (delete_command, "A6");
669                         Assert.IsTrue (item_command, "#06");
670
671                         //
672                         // Edit
673                         //
674                         ResetEvents ();
675                         command_args = new DataGridCommandEventArgs (null,
676                                         null, new CommandEventArgs ("Edit", String.Empty));
677                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
678                         p.EditCommand += new DataGridCommandEventHandler (EditCommandHandler);
679                         p.DoBubbleEvent (this, command_args);
680                         Assert.IsTrue (edit_command, "A7");
681                         Assert.IsTrue (item_command, "#07");
682
683                         ResetEvents ();
684                         command_args = new DataGridCommandEventArgs (null,
685                                         null, new CommandEventArgs ("edit", String.Empty));
686                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
687                         p.EditCommand += new DataGridCommandEventHandler (EditCommandHandler);
688                         p.DoBubbleEvent (this, command_args);
689                         Assert.IsTrue (edit_command, "A8");
690                         Assert.IsTrue (item_command, "#08");
691
692                         ResetEvents ();
693                         command_args = new DataGridCommandEventArgs (null,
694                                         null, new CommandEventArgs ("EDIT", String.Empty));
695                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
696                         p.EditCommand += new DataGridCommandEventHandler (EditCommandHandler);
697                         p.DoBubbleEvent (this, command_args);
698                         Assert.IsTrue (edit_command, "A9");
699                         Assert.IsTrue (item_command, "#09");
700
701                         //
702                         // Item
703                         //
704                         ResetEvents ();
705                         command_args = new DataGridCommandEventArgs (null,
706                                         null, new CommandEventArgs ("Item", String.Empty));
707                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
708                         p.DoBubbleEvent (this, command_args);
709                         Assert.IsTrue (item_command, "A10");
710
711                         ResetEvents ();
712                         command_args = new DataGridCommandEventArgs (null,
713                                         null, new CommandEventArgs ("item", String.Empty));
714                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
715                         p.DoBubbleEvent (this, command_args);
716                         Assert.IsTrue (item_command, "A11");
717
718                         ResetEvents ();
719                         command_args = new DataGridCommandEventArgs (null,
720                                         null, new CommandEventArgs ("ITEM", String.Empty));
721                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
722                         p.DoBubbleEvent (this, command_args);
723                         Assert.IsTrue (item_command, "A12");
724
725                         //
726                         // Sort
727                         //
728                         ResetEvents ();
729                         command_args = new DataGridCommandEventArgs (null,
730                                         null, new CommandEventArgs ("Sort", String.Empty));
731                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
732                         p.SortCommand += new DataGridSortCommandEventHandler (SortCommandHandler);
733                         p.DoBubbleEvent (this, command_args);
734                         Assert.IsTrue (sort_command, "A13");
735                         Assert.IsTrue (item_command, "#10");
736
737                         ResetEvents ();
738                         command_args = new DataGridCommandEventArgs (null,
739                                         null, new CommandEventArgs ("sort", String.Empty));
740                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
741                         p.SortCommand += new DataGridSortCommandEventHandler (SortCommandHandler);
742                         p.DoBubbleEvent (this, command_args);
743                         Assert.IsTrue (sort_command, "A14");
744                         Assert.IsTrue (item_command, "#11");
745
746                         ResetEvents ();
747                         command_args = new DataGridCommandEventArgs (null,
748                                         null, new CommandEventArgs ("SORT", String.Empty));
749                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
750                         p.SortCommand += new DataGridSortCommandEventHandler (SortCommandHandler);
751                         p.DoBubbleEvent (this, command_args);
752                         Assert.IsTrue (sort_command, "A15");
753                         Assert.IsTrue (item_command, "#12");
754
755                         //
756                         // Update
757                         //
758                         ResetEvents ();
759                         command_args = new DataGridCommandEventArgs (null,
760                                         null, new CommandEventArgs ("Update", String.Empty));
761                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
762                         p.UpdateCommand += new DataGridCommandEventHandler (UpdateCommandHandler);
763                         p.DoBubbleEvent (this, command_args);
764                         Assert.IsTrue (update_command, "A16");
765                         Assert.IsTrue (item_command, "#13");
766
767                         ResetEvents ();
768                         command_args = new DataGridCommandEventArgs (null,
769                                         null, new CommandEventArgs ("update", String.Empty));
770                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
771                         p.UpdateCommand += new DataGridCommandEventHandler (UpdateCommandHandler);
772                         p.DoBubbleEvent (this, command_args);
773                         Assert.IsTrue (update_command, "A17");
774                         Assert.IsTrue (item_command, "#14");
775
776                         ResetEvents ();
777                         command_args = new DataGridCommandEventArgs (null,
778                                         null, new CommandEventArgs ("UPDATE", String.Empty));
779                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
780                         p.UpdateCommand += new DataGridCommandEventHandler (UpdateCommandHandler);
781                         p.DoBubbleEvent (this, command_args);
782                         Assert.IsTrue (update_command, "A18");
783                         Assert.IsTrue (item_command, "#15");
784
785                         //
786                         // Select
787                         //
788                         DataGridItem item = new DataGridItem (0, 0, ListItemType.Item);
789                         
790                         ResetEvents ();
791                         command_args = new DataGridCommandEventArgs (item, null,
792                                         new CommandEventArgs ("Select", String.Empty));
793                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
794                         p.SelectedIndexChanged += new EventHandler (SelectedIndexChangedHandler);
795                         p.DoBubbleEvent (this, command_args);
796                         Assert.IsTrue (selected_changed, "A19");
797                         Assert.IsTrue (item_command, "#16");
798
799                         ResetEvents ();
800                         command_args = new DataGridCommandEventArgs (item, null,
801                                         new CommandEventArgs ("select", String.Empty));
802                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
803                         p.SelectedIndexChanged += new EventHandler (SelectedIndexChangedHandler);
804                         p.DoBubbleEvent (this, command_args);
805                         Assert.IsTrue (selected_changed, "A20");
806                         Assert.IsTrue (item_command, "#17");
807
808                         ResetEvents ();
809                         command_args = new DataGridCommandEventArgs (item, null,
810                                         new CommandEventArgs ("SELECT", String.Empty));
811                         p.ItemCommand += new DataGridCommandEventHandler (ItemCommandHandler);
812                         p.SelectedIndexChanged += new EventHandler (SelectedIndexChangedHandler);
813                         p.DoBubbleEvent (this, command_args);
814                         Assert.IsTrue (selected_changed, "A21");
815                         Assert.IsTrue (item_command, "#18");
816                 }
817
818                 [Test]
819                 public void BubblePageCommand ()
820                 {
821                         DataGridPoker p = new DataGridPoker ();
822                         DataGridItem item = new DataGridItem (0, 0, ListItemType.Item);
823                         DataGridCommandEventArgs command_args;
824
825
826                         //
827                         // Prev
828                         //
829                         ResetEvents ();
830                         command_args = new DataGridCommandEventArgs (item, null,
831                                         new CommandEventArgs ("Page", "Prev"));
832                         p.CurrentPageIndex = 10;
833                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
834                         p.DoBubbleEvent (this, command_args);
835                         Assert.IsTrue (page_index_changed, "A1");
836                         Assert.AreEqual (new_page_index, 9, "A2");
837
838                         ResetEvents ();
839                         command_args = new DataGridCommandEventArgs (item, null,
840                                         new CommandEventArgs ("page", "prev"));
841                         p.CurrentPageIndex = 10;
842                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
843                         p.DoBubbleEvent (this, command_args);
844                         Assert.IsTrue (page_index_changed, "A3");
845                         Assert.AreEqual (new_page_index, 9, "A4");
846
847                         ResetEvents ();
848                         command_args = new DataGridCommandEventArgs (item, null,
849                                         new CommandEventArgs ("PAGE", "PREV"));
850                         p.CurrentPageIndex = 10;
851                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
852                         p.DoBubbleEvent (this, command_args);
853                         Assert.IsTrue (page_index_changed, "A5");
854                         Assert.AreEqual (new_page_index, 9, "A6");
855
856                         
857                         //
858                         // Next
859                         //
860                         ResetEvents ();
861                         command_args = new DataGridCommandEventArgs (item, null,
862                                         new CommandEventArgs ("Page", "Next"));
863                         p.CurrentPageIndex = 10;
864                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
865                         p.DoBubbleEvent (this, command_args);
866                         Assert.IsTrue (page_index_changed, "A5");
867                         Assert.AreEqual (new_page_index, 11, "A6");
868
869                         ResetEvents ();
870                         command_args = new DataGridCommandEventArgs (item, null,
871                                         new CommandEventArgs ("page", "next"));
872                         p.CurrentPageIndex = 10;
873                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
874                         p.DoBubbleEvent (this, command_args);
875                         Assert.IsTrue (page_index_changed, "A7");
876                         Assert.AreEqual (new_page_index, 11, "A8");
877
878                         ResetEvents ();
879                         command_args = new DataGridCommandEventArgs (item, null,
880                                         new CommandEventArgs ("PAGE", "NEXT"));
881                         p.CurrentPageIndex = 10;
882                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
883                         p.DoBubbleEvent (this, command_args);
884                         Assert.IsTrue (page_index_changed, "A9");
885                         Assert.AreEqual (new_page_index, 11, "A10");
886
887
888                         //
889                         // Specific
890                         //
891                         ResetEvents ();
892                         command_args = new DataGridCommandEventArgs (item, null,
893                                         new CommandEventArgs ("Page", "25"));
894                         p.CurrentPageIndex = 10;
895                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
896                         p.DoBubbleEvent (this, command_args);
897                         Assert.IsTrue (page_index_changed, "A11");
898                         Assert.AreEqual (new_page_index, 24, "A12");
899
900                         ResetEvents ();
901                         command_args = new DataGridCommandEventArgs (item, null,
902                                         new CommandEventArgs ("Page", "0"));
903                         p.CurrentPageIndex = 10;
904                         p.PageIndexChanged += new DataGridPageChangedEventHandler (PageIndexChangedHandler);
905                         p.DoBubbleEvent (this, command_args);
906                         Assert.IsTrue (page_index_changed, "A11");
907                         Assert.AreEqual (new_page_index, -1, "A12");
908                 }
909
910                 [Test]
911                 [ExpectedException (typeof (FormatException))]
912                 public void BadBubblePageArg ()
913                 {
914                         DataGridPoker p = new DataGridPoker ();
915                         DataGridItem item = new DataGridItem (0, 0, ListItemType.Item);
916                         DataGridCommandEventArgs command_args;
917
918                         ResetEvents ();
919                         command_args = new DataGridCommandEventArgs (item, null,
920                                         new CommandEventArgs ("Page", "i am bad"));
921
922                         p.DoBubbleEvent (this, command_args);
923                 }
924
925                 [Test]
926                 [ExpectedException (typeof (InvalidCastException))]
927                 public void BadBubblePageArg2 ()
928                 {
929                         DataGridPoker p = new DataGridPoker ();
930                         DataGridItem item = new DataGridItem (0, 0, ListItemType.Item);
931                         DataGridCommandEventArgs command_args;
932
933                         ResetEvents ();
934                         command_args = new DataGridCommandEventArgs (item, null,
935                                         new CommandEventArgs ("Page", new object ()));
936
937                         p.DoBubbleEvent (this, command_args);
938                 }
939
940                 [Test]
941                 public void SaveViewState ()
942                 {
943                         DataGridPoker p = new DataGridPoker ();
944
945                         p.TrackState ();
946
947                         object [] vs = (object []) p.SaveState ();
948                         Assert.AreEqual (vs.Length, 11, "A1");
949
950                         // By default the viewstate is all null
951                         for (int i = 0; i < vs.Length; i++)
952                                 Assert.IsNull (vs [i], "A2-" + i);
953
954                         //
955                         // TODO: What goes in the [1] and [9] slots?
956                         //
957
958                         p.AllowPaging = true;
959                         vs = (object []) p.SaveState ();
960                         Assert.IsNotNull (vs [0], "A3");
961
962                         /*
963                           This test doesn't work right now. It must be an issue
964                           in the DataGridPagerStyle
965                           
966                         p.PagerStyle.Visible = true;
967                         vs = (object []) p.SaveState ();
968                         Assert.IsNotNull (vs [2], "A5");
969                         */
970                         
971                         p.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
972                         vs = (object []) p.SaveState ();
973                         Assert.IsNotNull (vs [3], "A6");
974
975                         p.FooterStyle.HorizontalAlign = HorizontalAlign.Center;
976                         vs = (object []) p.SaveState ();
977                         Assert.IsNotNull (vs [4], "A7");
978
979                         p.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
980                         vs = (object []) p.SaveState ();
981                         Assert.IsNotNull (vs [5], "A8");
982
983                         p.AlternatingItemStyle.HorizontalAlign = HorizontalAlign.Center;
984                         vs = (object []) p.SaveState ();
985                         Assert.IsNotNull (vs [6], "A9");
986
987                         p.SelectedItemStyle.HorizontalAlign = HorizontalAlign.Center;
988                         vs = (object []) p.SaveState ();
989                         Assert.IsNotNull (vs [7], "A10");
990
991                         p.EditItemStyle.HorizontalAlign = HorizontalAlign.Center;
992                         vs = (object []) p.SaveState ();
993                         Assert.IsNotNull (vs [8], "A11");
994
995                         PagedDataSource source = new PagedDataSource ();
996                         DataTable table = new DataTable ();
997                         ArrayList columns;
998
999                         table.Columns.Add (new DataColumn ("one", typeof (string)));
1000                         table.Columns.Add (new DataColumn ("two", typeof (string)));
1001                         table.Columns.Add (new DataColumn ("three", typeof (string)));
1002                         source.DataSource = new DataView (table);
1003                         columns = p.CreateColumns (source, true);
1004
1005                         vs = (object []) p.SaveState ();
1006                         Assert.IsNull (vs [9], "A12");
1007                         p.BackImageUrl = "foobar url";
1008                         vs = (object []) p.SaveState ();
1009                         Assert.IsNotNull (vs [9], "A12");
1010
1011                         Assert.IsNotNull (vs [10], "A12");
1012                         Assert.AreEqual (vs [10].GetType (), typeof (object []), "A12");
1013
1014                         object [] cols = (object []) vs [10];
1015                         Assert.AreEqual (cols.Length, 3, "A13");
1016                 }
1017
1018                 [Test]
1019                 public void CreateColumnSet ()
1020                 {
1021                         DataGridPoker p = new DataGridPoker ();
1022                         PagedDataSource source = new PagedDataSource ();
1023                         DataTable table = new DataTable ();
1024                         ArrayList columns;
1025
1026                         table.Columns.Add (new DataColumn ("one", typeof (string)));
1027                         table.Columns.Add (new DataColumn ("two", typeof (string)));
1028                         table.Columns.Add (new DataColumn ("three", typeof (string)));
1029
1030                         source.DataSource = new DataView (table);
1031
1032                         columns = p.CreateColumns (source, true);
1033                         Assert.AreEqual (columns.Count, 3, "A1");
1034                         Assert.AreEqual (((DataGridColumn) columns [0]).HeaderText, "one", "A2");
1035                         Assert.AreEqual (((DataGridColumn) columns [1]).HeaderText, "two", "A3");
1036                         Assert.AreEqual (((DataGridColumn) columns [2]).HeaderText, "three", "A4");
1037
1038                         // AutoGenerated columns are not added to the ColumnsCollection
1039                         Assert.AreEqual (p.Columns.Count, 0, "A5");
1040                         
1041                         // Without allowing data dinding,
1042                         columns = p.CreateColumns (source, false);
1043                         Assert.AreEqual (columns.Count, 3, "A6");
1044                         Assert.AreEqual (((DataGridColumn) columns [0]).HeaderText, "one", "A7");
1045                         Assert.AreEqual (((DataGridColumn) columns [1]).HeaderText, "two", "A8");
1046                         Assert.AreEqual (((DataGridColumn) columns [2]).HeaderText, "three", "A9");
1047
1048
1049                         // Mixing with already added columns
1050                         p = new DataGridPoker ();
1051                         DataGridColumn a = new ButtonColumn ();
1052                         DataGridColumn b = new ButtonColumn ();
1053
1054                         a.HeaderText = "A";
1055                         b.HeaderText = "B";
1056                         p.Columns.Add (a);
1057                         p.Columns.Add (b);
1058
1059                         columns = p.CreateColumns (source, true);
1060                         Assert.AreEqual (columns.Count, 5, "A6");
1061                         Assert.AreEqual (((DataGridColumn) columns [0]).HeaderText, "A", "A10");
1062                         Assert.AreEqual (((DataGridColumn) columns [1]).HeaderText, "B", "A11");
1063                         Assert.AreEqual (((DataGridColumn) columns [2]).HeaderText, "one", "A12");
1064                         Assert.AreEqual (((DataGridColumn) columns [3]).HeaderText, "two", "A13");
1065                         Assert.AreEqual (((DataGridColumn) columns [4]).HeaderText, "three", "A14");
1066
1067                         // Assigned properties of the newly created columns
1068                         BoundColumn one = (BoundColumn) columns [2];
1069
1070                         Assert.AreEqual (one.HeaderText, "one", "A15");
1071                         Assert.AreEqual (one.DataField, "one", "A16");
1072                         Assert.AreEqual (one.DataFormatString, String.Empty, "A17");
1073                         Assert.AreEqual (one.SortExpression, "one", "A18");
1074                         Assert.AreEqual (one.HeaderImageUrl, String.Empty, "A19");
1075                         Assert.AreEqual (one.FooterText, String.Empty, "A20");
1076                 }
1077
1078                 [Test]
1079                 public void CreateColumnsBinding ()
1080                 {
1081                         DataGridPoker p = new DataGridPoker ();
1082                         PagedDataSource source = new PagedDataSource ();
1083                         DataTable table = new DataTable ();
1084                         ArrayList columns;
1085
1086                         table.Columns.Add (new DataColumn ("one", typeof (string)));
1087                         table.Columns.Add (new DataColumn ("two", typeof (string)));
1088                         table.Columns.Add (new DataColumn ("three", typeof (string)));
1089
1090                         source.DataSource = new DataView (table);
1091
1092                         columns = p.CreateColumns (source, true);
1093                         Assert.AreEqual (columns.Count, 3, "A1");
1094                         Assert.AreEqual (((DataGridColumn) columns [0]).HeaderText, "one", "A2");
1095                         Assert.AreEqual (((DataGridColumn) columns [1]).HeaderText, "two", "A3");
1096                         Assert.AreEqual (((DataGridColumn) columns [2]).HeaderText, "three", "A4");
1097
1098                         table.Columns.Add (new DataColumn ("four", typeof (string)));
1099                         table.Columns.Add (new DataColumn ("five", typeof (string)));
1100                         table.Columns.Add (new DataColumn ("six", typeof (string)));
1101
1102                         // Just gets the old columns
1103                         columns = p.CreateColumns (source, false);
1104                         Assert.AreEqual (columns.Count, 3, "A5");
1105                         Assert.AreEqual (((DataGridColumn) columns [0]).HeaderText, "one", "A6");
1106                         Assert.AreEqual (((DataGridColumn) columns [1]).HeaderText, "two", "A7");
1107                         Assert.AreEqual (((DataGridColumn) columns [2]).HeaderText, "three", "A8");
1108
1109                         columns = p.CreateColumns (source, true);
1110                         Assert.AreEqual (columns.Count, 6, "A9");
1111                         Assert.AreEqual (((DataGridColumn) columns [0]).HeaderText, "one", "A10");
1112                         Assert.AreEqual (((DataGridColumn) columns [1]).HeaderText, "two", "A11");
1113                         Assert.AreEqual (((DataGridColumn) columns [2]).HeaderText, "three", "A12");
1114                         Assert.AreEqual (((DataGridColumn) columns [3]).HeaderText, "four", "A13");
1115                         Assert.AreEqual (((DataGridColumn) columns [4]).HeaderText, "five", "A14");
1116                         Assert.AreEqual (((DataGridColumn) columns [5]).HeaderText, "six", "A15");
1117
1118                         // Assigned properties of the newly created columns
1119                         BoundColumn one = (BoundColumn) columns [0];
1120
1121                         Assert.AreEqual (one.HeaderText, "one", "A16");
1122                         Assert.AreEqual (one.DataField, "one", "A17");
1123                         Assert.AreEqual (one.DataFormatString, String.Empty, "A18");
1124                         Assert.AreEqual (one.SortExpression, "one", "A19");
1125                         Assert.AreEqual (one.HeaderImageUrl, String.Empty, "A20");
1126                         Assert.AreEqual (one.FooterText, String.Empty, "A21");
1127                 }
1128
1129                 [Test]
1130                 public void CreateSimpleColumns ()
1131                 {
1132                         DataGridPoker p = new DataGridPoker ();
1133                         PagedDataSource source = new PagedDataSource ();
1134                         ArrayList list = new ArrayList ();
1135                         ArrayList columns;
1136                         
1137                         list.Add ("One");
1138                         list.Add ("Two");
1139                         list.Add ("Three");
1140
1141                         source.DataSource = list;
1142                         columns = p.CreateColumns (source, true);
1143                         Assert.AreEqual (1, columns.Count, "A1");
1144                         Assert.AreEqual ("Item", ((DataGridColumn) columns [0]).HeaderText, "A2");
1145
1146                         AmazingEnumerable amazing = new AmazingEnumerable (list);
1147
1148                         source.DataSource = amazing;
1149                         columns = p.CreateColumns (source, true);
1150                         Assert.AreEqual (1, columns.Count, "A3");
1151
1152                         BoundColumn one = (BoundColumn) columns [0];
1153
1154                         Assert.AreEqual ("Item", one.HeaderText, "A4");
1155
1156                         // I guess this makes it bind to itself ?
1157                         Assert.AreEqual (BoundColumn.thisExpr, one.DataField, "A5"); 
1158
1159                         Assert.AreEqual (String.Empty, one.DataFormatString, "A6");
1160                         Assert.AreEqual ("Item", one.SortExpression, "A7");
1161                         Assert.AreEqual (String.Empty, one.HeaderImageUrl, "A8");
1162                         Assert.AreEqual (String.Empty, one.FooterText, "A9");
1163                         Assert.AreEqual ("Item", one.HeaderText, "A10");
1164
1165                         source.DataSource = new ArrayList ();
1166                         columns = p.CreateColumns (source, true);
1167                         Assert.AreEqual (0, columns.Count, "A11");
1168                 }
1169
1170                 [Test]
1171                 public void DataBindingEnumerator ()
1172                 {
1173                         DataGridPoker p = new DataGridPoker ();
1174                         PagedDataSource source = new PagedDataSource ();
1175                         ArrayList list = new ArrayList ();
1176                         ArrayList columns;
1177                         
1178                         list.Add ("One");
1179                         list.Add ("Two");
1180                         list.Add ("Three");
1181
1182                         AmazingEnumerable amazing = new AmazingEnumerable (list);
1183                         source.DataSource = amazing;
1184                         columns = p.CreateColumns (source, true);
1185                         Assert.AreEqual (1, columns.Count, "A1");
1186                         Assert.AreEqual ("Item", ((DataGridColumn) columns [0]).HeaderText, "A2");
1187                         Assert.AreEqual (1, amazing.CallCount, "A3");
1188                         Assert.AreEqual (0, p.DataKeys.Count, "A4");
1189                 }
1190
1191                 class Custom : ICustomTypeDescriptor {
1192                         public AttributeCollection GetAttributes ()
1193                         {
1194                                 throw new Exception ();
1195                         }
1196
1197                         public string GetClassName()
1198                         {
1199                                 throw new Exception ();
1200                         }
1201
1202                         public string GetComponentName()
1203                         {
1204                                 throw new Exception ();
1205                         }
1206
1207                         public TypeConverter GetConverter()
1208                         {
1209                                 throw new Exception ();
1210                         }
1211
1212                         public EventDescriptor GetDefaultEvent()
1213                         {
1214                                 throw new Exception ();
1215                         }
1216
1217                         public PropertyDescriptor GetDefaultProperty()
1218                         {
1219                                 throw new Exception ();
1220                         }
1221
1222                         public object GetEditor (Type editorBaseType)
1223                         {
1224                                 throw new Exception ();
1225                         }
1226
1227                         public EventDescriptorCollection GetEvents ()
1228                         {
1229                                 throw new Exception ();
1230                         }
1231
1232                         public EventDescriptorCollection GetEvents (Attribute[] arr)
1233                         {
1234                                 throw new Exception ();
1235                         }
1236
1237                         public int CallCount;
1238                         public PropertyDescriptorCollection GetProperties()
1239                         {
1240                                 // MS calls this one
1241                                 if (CallCount++ > 0)
1242                                         throw new Exception ("This should not happen");
1243                                 PropertyDescriptorCollection coll = new PropertyDescriptorCollection (null);
1244                                 coll.Add (new MyPropertyDescriptor ());
1245                                 return coll;
1246                         }
1247
1248                         public PropertyDescriptorCollection GetProperties (Attribute[] arr)
1249                         {
1250                                 // We call this one
1251                                 return GetProperties ();
1252                         }
1253
1254                         public object GetPropertyOwner (PropertyDescriptor pd)
1255                         {
1256                                 throw new Exception ();
1257                         }
1258                 }
1259
1260                 class MyPropertyDescriptor : PropertyDescriptor {
1261                         int val;
1262
1263                         public MyPropertyDescriptor () : base ("CustomName", null)
1264                         {
1265                         }
1266
1267                         public override Type ComponentType {
1268                                 get { return typeof (MyPropertyDescriptor); }
1269                         }
1270
1271                         public override bool IsReadOnly {
1272                                 get { return true; }
1273                         }
1274
1275                         public override Type PropertyType {
1276                                 get { return typeof (int); }
1277                         }
1278
1279                         public override object GetValue (object component)
1280                         {
1281                                 return val++;
1282                         }
1283
1284                         public override void SetValue (object component, object value)
1285                         {
1286                         }
1287
1288                         public override void ResetValue (object component)
1289                         {
1290                         }
1291
1292                         public override bool CanResetValue (object component)
1293                         {
1294                                 return false;
1295                         }
1296
1297                         public override bool ShouldSerializeValue (object component)
1298                         {
1299                                 return false;
1300                         }
1301                 }
1302
1303                 class MyEnumerable : IEnumerable {
1304                         public object Item;
1305                         public IEnumerator GetEnumerator ()
1306                         {
1307                                 ArrayList list = new ArrayList ();
1308                                 list.Add (Item);
1309                                 return list.GetEnumerator ();
1310                         }
1311                 }
1312
1313                 [Test]
1314                 public void DataBindingCustomElement ()
1315                 {
1316                         DataGridPoker p = new DataGridPoker ();
1317                         p.DataKeyField = "CustomName";
1318                         PagedDataSource source = new PagedDataSource ();
1319                         MyEnumerable myenum = new MyEnumerable ();
1320                         myenum.Item = new Custom ();
1321                         source.DataSource = myenum;
1322                         ArrayList columns = p.CreateColumns (source, true);
1323                         Assert.AreEqual (1, columns.Count, "A1");
1324                         Assert.AreEqual ("CustomName", ((DataGridColumn) columns [0]).HeaderText, "A2");
1325                         Assert.AreEqual (0, p.DataKeys.Count, "A3");
1326                 }
1327
1328                 public class data
1329                 {
1330                         private static ArrayList _data = new ArrayList ();
1331
1332                         static data () {
1333                                 _data.Add (new DataItem (1, "heh1"));
1334                                 _data.Add (new DataItem (2, "heh2"));
1335                                 _data.Add (new DataItem (3, "heh3"));
1336                                 _data.Add (new DataItem (4, "heh4"));
1337                                 _data.Add (new DataItem (5, "heh5"));
1338                                 _data.Add (new DataItem (6, "heh6"));
1339                                 _data.Add (new DataItem (7, "heh7"));
1340                                 _data.Add (new DataItem (8, "heh8"));
1341                                 _data.Add (new DataItem (9, "heh9"));
1342                                 _data.Add (new DataItem (10, "heh10"));
1343                         }
1344
1345                         public data () {
1346                         }
1347
1348                         public ArrayList GetAllItems () {
1349                                 return _data;
1350                         }
1351
1352                         public ArrayList GetPagedItems (int startIndex, int maxRows) 
1353                         {
1354                                 ArrayList list = new ArrayList ();
1355                                 if (startIndex < _data.Count - 1) {
1356                                         int countToReturn = Math.Min (maxRows, _data.Count - startIndex);
1357                                         for (int i = startIndex; i < startIndex + countToReturn; i++) {
1358                                                 list.Add (_data [i]);
1359                                         }
1360                                 }
1361
1362                                 return list;
1363                         }
1364
1365                         public int GetCount () 
1366                         {
1367                                 return _data.Count;
1368                         }
1369
1370                         public void UpdateItem (int id, string name) {
1371                                 foreach (DataItem i in _data) {
1372                                         if (i.ID == id) {
1373                                                 i.Name = name;
1374                                                 return;
1375                                         }
1376                                 }
1377                         }
1378                 }
1379
1380                 public class DataItem
1381                 {
1382                         int _id = 0;
1383                         string _name = "";
1384
1385                         public DataItem (int id, string name) {
1386                                 _id = id;
1387                                 _name = name;
1388                         }
1389
1390                         public int ID {
1391                                 get { return _id; }
1392                         }
1393
1394                         public string Name {
1395                                 get { return _name; }
1396                                 set { _name = value; }
1397                         }
1398                 }
1399
1400                 public class DataSourceObject
1401                 {
1402                         public static List<string> GetList (string sortExpression, int startRowIndex, int maximumRows) {
1403                                 return GetList ();
1404                         }
1405
1406                         public static List<string> GetList (int startRowIndex, int maximumRows) {
1407                                 return GetList ();
1408                         }
1409
1410                         public static List<string> GetList (string sortExpression) {
1411                                 return GetList ();
1412                         }
1413
1414                         public static List<string> GetList () {
1415                                 List<string> list = new List<string> ();
1416                                 list.Add ("Norway");
1417                                 list.Add ("Sweden");
1418                                 list.Add ("France");
1419                                 list.Add ("Italy");
1420                                 list.Add ("Israel");
1421                                 list.Add ("Russia");
1422                                 return list;
1423                         }
1424
1425                         public static int GetCount () {
1426                                 return GetList ().Count;
1427                         }
1428                 }
1429
1430                 [Test]
1431                 [ExpectedException(typeof(InvalidOperationException))]
1432                 public void DataSourceAndDataSourceID () 
1433                 {
1434                         Page page = new Page ();
1435                         DataGridPoker dg = new DataGridPoker ();
1436                         
1437                         page.Controls.Add (dg);
1438
1439                         DataTable dt = new DataTable ();
1440                         dt.Columns.Add (new DataColumn ("something", typeof (Int32)));
1441                         DataRow dr = dt.NewRow ();
1442                         dt.Rows.Add (new object [] { 1 });
1443                         DataView dv = new DataView (dt);
1444
1445                         dg.DataSource = dv;
1446
1447                         ObjectDataSource ds = new ObjectDataSource ();
1448                         ds.TypeName = typeof (DataSourceObject).AssemblyQualifiedName;
1449                         ds.SelectMethod = "GetList";
1450                         ds.SortParameterName = "sortExpression";
1451                         ds.ID = "Data";
1452                         page.Controls.Add (ds);
1453
1454                         dg.DataSourceID = "Data";
1455
1456                         dg.DataBind ();
1457                 }
1458
1459                 [Test]
1460                 public void DataBindingDataSourceID () 
1461                 {
1462                         Page page = new Page ();
1463                         DataGridPoker dg = new DataGridPoker ();
1464                         page.Controls.Add (dg);
1465
1466                         ObjectDataSource ds = new ObjectDataSource ();
1467                         ds.TypeName = typeof (DataSourceObject).AssemblyQualifiedName;
1468                         ds.SelectMethod = "GetList";
1469                         ds.SortParameterName = "sortExpression";
1470                         ds.ID = "Data";
1471                         page.Controls.Add (ds);
1472
1473                         dg.DataSourceID = "Data";
1474                         dg.DataBind ();
1475
1476                         Assert.AreEqual (6, dg.Items.Count, "DataBindingDataSourceID");
1477                 }
1478
1479                 [Test]
1480                 [NUnit.Framework.Category ("NunitWeb")]
1481                 public void DataBindingDataSourceIDAutomatic () 
1482                 {
1483                         WebTest t = new WebTest ();
1484                         PageDelegates pd = new PageDelegates();
1485                         pd.Load = DataSourceIDAutomatic_Load;
1486                         pd.PreRender = DataSourceIDAutomatic_PreRender;
1487                         t.Invoker = new PageInvoker (pd);
1488
1489                         t.Run ();
1490                 }
1491
1492                 public static void DataSourceIDAutomatic_Load (Page page) 
1493                 {
1494                         DataGridPoker dg = new DataGridPoker ();
1495                         dg.ID = "DataGrid";
1496                         page.Controls.Add (dg);
1497
1498                         ObjectDataSource ds = new ObjectDataSource ();
1499                         ds.TypeName = typeof (DataSourceObject).AssemblyQualifiedName;
1500                         ds.SelectMethod = "GetList";
1501                         ds.SortParameterName = "sortExpression";
1502                         ds.ID = "Data";
1503                         page.Controls.Add (ds);
1504
1505                         dg.DataSourceID = "Data";
1506                 }
1507
1508                 public static void DataSourceIDAutomatic_PreRender (Page page) 
1509                 {
1510                         DataGrid dg = (DataGrid)page.FindControl ("DataGrid");
1511
1512                         Assert.AreEqual (6, dg.Items.Count, "DataBindingDataSourceID");
1513                 }
1514
1515                 [Test]
1516                 public void DataSourceIDBindingNoColumns () 
1517                 {
1518                         Page page = new Page ();
1519                         DataGridPoker dg = new DataGridPoker ();
1520                         dg.ID = "DataGrid";
1521                         dg.AutoGenerateColumns = false;
1522
1523                         page.Controls.Add (dg);
1524
1525                         ObjectDataSource ds = new ObjectDataSource ();
1526                         ds.TypeName = typeof (DataSourceObject).AssemblyQualifiedName;
1527                         ds.SelectMethod = "GetList";
1528                         ds.SortParameterName = "sortExpression";
1529                         ds.ID = "Data";
1530                         page.Controls.Add (ds);
1531
1532                         dg.DataSourceID = "Data";
1533                         dg.DataBind ();
1534
1535                         Assert.AreEqual (0, dg.Columns.Count, "Columns Count");
1536                         Assert.AreEqual (0, dg.Items.Count, "Items Count");
1537                 }
1538
1539                 [Test]
1540                 public void DataSourceIDBindingManualColumns () 
1541                 {
1542                         Page page = new Page ();
1543                         DataGridPoker dg = new DataGridPoker ();
1544                         dg.ID = "DataGrid";
1545                         dg.AutoGenerateColumns = false;
1546                         BoundColumn col = new BoundColumn();
1547                         col.DataField = "something";
1548                         dg.Columns.Add (col);
1549
1550                         page.Controls.Add (dg);
1551
1552                         DataTable dt = new DataTable ();
1553                         dt.Columns.Add (new DataColumn ("something", typeof (Int32)));
1554                         DataRow dr = dt.NewRow ();
1555                         dt.Rows.Add (new object [] { 1 });
1556                         dt.Rows.Add (new object [] { 2 });
1557                         dt.Rows.Add (new object [] { 3 });
1558                         dt.Rows.Add (new object [] { 4 });
1559                         dt.Rows.Add (new object [] { 5 });
1560                         dt.Rows.Add (new object [] { 6 });
1561
1562                         DataView dv = new DataView (dt);
1563
1564                         dg.DataSource = dv;
1565                         dg.DataBind ();
1566
1567                         Assert.AreEqual (1, dg.Columns.Count, "Columns Count");
1568                         Assert.AreEqual (6, dg.Items.Count, "Items Count");
1569                         Assert.AreEqual ("1", dg.Items[0].Cells[0].Text, "Cell content");
1570                 }
1571
1572                 [Test]
1573                 [NUnit.Framework.Category ("NunitWeb")]
1574                 public void Paging ()
1575                 {
1576                         WebTest t = new WebTest ("DataGrid.aspx");
1577                         t.Invoker = PageInvoker.CreateOnInit (DataGrid_OnInit);
1578                         string html = t.Run ();
1579                         string gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1580 #if NET_4_0
1581                         string expectedFirstPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1582 #else
1583                         string expectedFirstPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1584 #endif
1585
1586                         HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid initial Render");
1587
1588                         FormRequest fr = new FormRequest (t.Response, "form1");
1589                         fr.Controls.Add ("__EVENTTARGET");
1590                         fr.Controls.Add ("__EVENTARGUMENT");
1591 #if DOT_NET
1592                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl09$ctl01"; 
1593 #else
1594                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl08$ctl01";
1595 #endif
1596                         fr.Controls ["__EVENTARGUMENT"].Value = "";
1597                         t.Request = fr;
1598
1599                         html = t.Run ();
1600                         gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1601 #if NET_4_0
1602                         string expectedSecondPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>6</td><td>heh6</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>6</td><td>heh6</td><td>Comment 6</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>7</td><td>heh7</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>7</td><td>heh7</td><td>Comment 7</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>8</td><td>heh8</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>8</td><td>heh8</td><td>Comment 8</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>9</td><td>heh9</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>9</td><td>heh9</td><td>Comment 9</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>10</td><td>heh10</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>10</td><td>heh10</td><td>Comment 10</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Previous</a>&nbsp;<span>Next</span></td>\r\n\t</tr>\r\n</table>";
1603 #else
1604                         string expectedSecondPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>6</td><td>heh6</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>6</td><td>heh6</td><td>Comment 6</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>7</td><td>heh7</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>7</td><td>heh7</td><td>Comment 7</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>8</td><td>heh8</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>8</td><td>heh8</td><td>Comment 8</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>9</td><td>heh9</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>9</td><td>heh9</td><td>Comment 9</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>10</td><td>heh10</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>10</td><td>heh10</td><td>Comment 10</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl00','')\" style=\"color:#333333;\">Previous</a>&nbsp;<span>Next</span></td>\r\n\t</tr>\r\n</table>";
1605 #endif
1606                         HtmlDiff.AssertAreEqual (expectedSecondPage, gridHtml, "DataGrid Paging Next");
1607
1608                         fr = new FormRequest (t.Response, "form1");
1609                         fr.Controls.Add ("__EVENTTARGET");
1610                         fr.Controls.Add ("__EVENTARGUMENT");
1611 #if DOT_NET
1612                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl09$ctl00"; 
1613 #else
1614                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl08$ctl00";
1615 #endif
1616                         fr.Controls ["__EVENTARGUMENT"].Value = "";
1617                         t.Request = fr;
1618
1619                         html = t.Run ();
1620                         gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1621
1622                         HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid Paging Previous");
1623                 }
1624
1625                 [Test]
1626                 [NUnit.Framework.Category ("NunitWeb")]
1627                 public void EditUpdateDelete ()
1628                 {
1629                         WebTest t = new WebTest ("DataGrid.aspx");
1630                         t.Invoker = PageInvoker.CreateOnInit (DataGrid_OnInit);
1631                         string html = t.Run ();
1632                         string gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1633 #if NET_4_0
1634                         string expectedFirstPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1635 #else
1636                         string expectedFirstPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1637 #endif
1638
1639                         HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid initial Render");
1640
1641                         FormRequest fr = new FormRequest (t.Response, "form1");
1642                         fr.Controls.Add ("__EVENTTARGET");
1643                         fr.Controls.Add ("__EVENTARGUMENT");
1644 #if DOT_NET
1645                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl03$ctl00";
1646 #else
1647                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl02$ctl00";
1648 #endif
1649                         fr.Controls ["__EVENTARGUMENT"].Value = "";
1650                         t.Request = fr;
1651
1652                         html = t.Run ();
1653                         gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1654 #if NET_4_0
1655                         string expectedSecondPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:Green;font-weight:normal;font-style:normal;text-decoration:none;\">\r\n\t\t<td>1</td><td><input name=\"DataGrid1$ctl03$ctl00\" type=\"text\" value=\"heh1\" /></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Update</a>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl02&#39;,&#39;&#39;)\" style=\"color:#333333;\">Cancel</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl03&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>1</td><td><input name=\"DataGrid1$ctl03$ctl04\" type=\"text\" value=\"heh1\" /></td><td><input name=\"DataGrid1$ctl03$ctl05\" type=\"text\" value=\"Comment 1\" /></td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1656 #else
1657                         string expectedSecondPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:Green;font-weight:normal;font-style:normal;text-decoration:none;\">\r\n\t\t<td>1</td><td><input name=\"DataGrid1$ctl03$ctl00\" type=\"text\" value=\"heh1\" /></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Update</a>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl02','')\" style=\"color:#333333;\">Cancel</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl03','')\" style=\"color:#333333;\">Delete</a></td><td>1</td><td><input name=\"DataGrid1$ctl03$ctl04\" type=\"text\" value=\"heh1\" /></td><td><input name=\"DataGrid1$ctl03$ctl05\" type=\"text\" value=\"Comment 1\" /></td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1658 #endif
1659                         HtmlDiff.AssertAreEqual (expectedSecondPage, gridHtml, "DataGrid Edit");
1660
1661                         fr = new FormRequest (t.Response, "form1");
1662                         fr.Controls.Add ("__EVENTTARGET");
1663                         fr.Controls.Add ("__EVENTARGUMENT");
1664 #if DOT_NET
1665                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl03$ctl01";
1666 #else
1667                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl02$ctl01";
1668 #endif
1669                         fr.Controls ["__EVENTARGUMENT"].Value = "";
1670 #if DOT_NET
1671                         fr.Controls.Add ("DataGrid1$ctl03$ctl00");
1672                         fr.Controls ["DataGrid1$ctl03$ctl00"].Value = "New Value";
1673 #else
1674                         fr.Controls.Add ("DataGrid1$ctl02$ctl00");
1675                         fr.Controls ["DataGrid1$ctl02$ctl00"].Value = "New Value";
1676 #endif
1677                         t.Request = fr;
1678
1679                         html = t.Run ();
1680                         gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1681 #if NET_4_0
1682                         string expectedThirdPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>New Value</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>New Value</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1683 #else
1684                         string expectedThirdPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>New Value</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>New Value</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1685 #endif
1686
1687                         HtmlDiff.AssertAreEqual (expectedThirdPage, gridHtml, "DataGrid Update");
1688
1689                         fr = new FormRequest (t.Response, "form1");
1690                         fr.Controls.Add ("__EVENTTARGET");
1691                         fr.Controls.Add ("__EVENTARGUMENT");
1692 #if DOT_NET
1693                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl04$ctl01";
1694 #else
1695                         fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl03$ctl01";
1696 #endif
1697                         fr.Controls ["__EVENTARGUMENT"].Value = "";
1698                         t.Request = fr;
1699
1700                         html = t.Run ();
1701                         gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1702 #if NET_4_0
1703                         string expectedFourthPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>New Value</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>New Value</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>6</td><td>heh6</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>6</td><td>heh6</td><td>Comment 6</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1704 #else
1705                         string expectedFourthPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>New Value</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>New Value</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>6</td><td>heh6</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>6</td><td>heh6</td><td>Comment 6</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1706 #endif
1707
1708                         HtmlDiff.AssertAreEqual (expectedFourthPage, gridHtml, "DataGrid Delete");
1709                 }
1710
1711                 [Test]
1712                 [NUnit.Framework.Category ("NunitWeb")]
1713                 public void SelectedIndex ()
1714                 {
1715                         WebTest t = new WebTest ("DataGrid.aspx");
1716                         t.Invoker = PageInvoker.CreateOnInit (DataGrid_OnInit);
1717                         string html = t.Run ();
1718                         string gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1719 #if NET_4_0
1720                         string expectedFirstPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1721 #else
1722                         string expectedFirstPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1723 #endif
1724
1725                         HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid initial Render");
1726
1727                         FormRequest fr = new FormRequest (t.Response, "form1");
1728                         fr.Controls.Add ("__EVENTTARGET");
1729                         fr.Controls.Add ("__EVENTARGUMENT");
1730                         fr.Controls ["__EVENTTARGET"].Value = "Button1";
1731                         fr.Controls ["__EVENTARGUMENT"].Value = "";
1732                         t.Request = fr;
1733
1734                         html = t.Run ();
1735                         gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1736 #if NET_4_0
1737                         string expectedSecondPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:Navy;background-color:#FFCC66;font-weight:bold;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:Navy;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:Navy;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1738 #else
1739                         string expectedSecondPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:Navy;background-color:#FFCC66;font-weight:bold;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:Navy;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:Navy;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1740 #endif
1741                         HtmlDiff.AssertAreEqual (expectedSecondPage, gridHtml, "DataGrid Selected 1");
1742
1743                         fr = new FormRequest (t.Response, "form1");
1744                         fr.Controls.Add ("__EVENTTARGET");
1745                         fr.Controls.Add ("__EVENTARGUMENT");
1746                         fr.Controls ["__EVENTTARGET"].Value = "Button1";
1747                         fr.Controls ["__EVENTARGUMENT"].Value = "";
1748                         t.Request = fr;
1749
1750                         html = t.Run ();
1751                         gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1752 #if NET_4_0
1753                         string expectedThirdPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl00&#39;,&#39;&#39;)\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl01&#39;,&#39;&#39;)\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl02$ctl02&#39;,&#39;&#39;)\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl03$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:Navy;background-color:#FFCC66;font-weight:bold;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl00&#39;,&#39;&#39;)\" style=\"color:Navy;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl04$ctl01&#39;,&#39;&#39;)\" style=\"color:Navy;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl05$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl06$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl00&#39;,&#39;&#39;)\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl07$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack(&#39;DataGrid1$ctl09$ctl01&#39;,&#39;&#39;)\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1754 #else
1755                         string expectedThirdPage = "\n        <table cellspacing=\"0\" cellpadding=\"4\" border=\"0\" id=\"DataGrid1\" style=\"color:#333333;border-collapse:collapse;\">\r\n\t<tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>ID</td><td>Name</td><td>&nbsp;</td><td>&nbsp;</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl00','')\" style=\"color:White;\">ID</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl01','')\" style=\"color:White;\">Name</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl02$ctl02','')\" style=\"color:White;\">Comment</a></td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>1</td><td>heh1</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl03$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>1</td><td>heh1</td><td>Comment 1</td>\r\n\t</tr><tr style=\"color:Navy;background-color:#FFCC66;font-weight:bold;\">\r\n\t\t<td>2</td><td>heh2</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl00','')\" style=\"color:Navy;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl04$ctl01','')\" style=\"color:Navy;\">Delete</a></td><td>2</td><td>heh2</td><td>Comment 2</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>3</td><td>heh3</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl05$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>3</td><td>heh3</td><td>Comment 3</td>\r\n\t</tr><tr style=\"color:#333333;background-color:White;\">\r\n\t\t<td>4</td><td>heh4</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl06$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>4</td><td>heh4</td><td>Comment 4</td>\r\n\t</tr><tr style=\"color:#333333;background-color:#FFFBD6;\">\r\n\t\t<td>5</td><td>heh5</td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl00','')\" style=\"color:#333333;\">Edit</a></td><td><a href=\"javascript:__doPostBack('DataGrid1$ctl07$ctl01','')\" style=\"color:#333333;\">Delete</a></td><td>5</td><td>heh5</td><td>Comment 5</td>\r\n\t</tr><tr style=\"color:White;background-color:#990000;font-weight:bold;\">\r\n\t\t<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>\r\n\t</tr><tr align=\"center\" style=\"color:#333333;background-color:#FFCC66;\">\r\n\t\t<td colspan=\"4\"><span>Previous</span>&nbsp;<a href=\"javascript:__doPostBack('DataGrid1$ctl09$ctl01','')\" style=\"color:#333333;\">Next</a></td>\r\n\t</tr>\r\n</table>";
1756 #endif
1757
1758                         HtmlDiff.AssertAreEqual (expectedThirdPage, gridHtml, "DataGrid Selected 2");
1759                 }
1760
1761                 public static void DataGrid_OnInit (Page p) 
1762                 {
1763                         if (!p.IsPostBack)
1764                                 MyDataSource.Init ();
1765                         DataGrid DataGrid1 = (DataGrid)p.FindControl ("DataGrid1");
1766                         DataGrid1.PageIndexChanged += new DataGridPageChangedEventHandler (DataGrid1_PageIndexChanged);
1767                         DataGrid1.CancelCommand += new DataGridCommandEventHandler (DataGrid1_CancelCommand);
1768                         DataGrid1.DeleteCommand += new DataGridCommandEventHandler (DataGrid1_DeleteCommand);
1769                         DataGrid1.EditCommand += new DataGridCommandEventHandler (DataGrid1_EditCommand);
1770                         DataGrid1.UpdateCommand += new DataGridCommandEventHandler (DataGrid1_UpdateCommand);
1771                         DataGrid1.ItemCreated += new DataGridItemEventHandler (DataGrid1_ItemCreated);
1772                 }
1773
1774                 public static void DataGrid1_ItemCreated (object sender, DataGridItemEventArgs e)
1775                 {
1776                         if (e.Item.ItemType == ListItemType.Pager) {
1777                                 e.Item.Cells [0].ColumnSpan = 4;
1778                         }
1779                 }
1780
1781                 public static void DataGrid1_PageIndexChanged (object source, DataGridPageChangedEventArgs e) 
1782                 {
1783                         DataGrid DataGrid1 = (DataGrid) source;
1784                         DataGrid1.CurrentPageIndex = e.NewPageIndex;
1785                         DataGrid1.DataBind ();
1786                 }
1787
1788                 public static void DataGrid1_EditCommand (object source, DataGridCommandEventArgs e) 
1789                 {
1790                         DataGrid DataGrid1 = (DataGrid) source;
1791                         DataGrid1.EditItemIndex = e.Item.ItemIndex;
1792                         DataGrid1.DataBind ();
1793                 }
1794
1795                 public static void DataGrid1_DeleteCommand (object source, DataGridCommandEventArgs e) 
1796                 {
1797                         DataGrid DataGrid1 = (DataGrid) source;
1798                         MyDataSource ds = new MyDataSource ();
1799                         ds.DeleteItem (e.Item.DataSetIndex);
1800                         DataGrid1.DataBind ();
1801                 }
1802
1803                 public static void DataGrid1_UpdateCommand (object source, DataGridCommandEventArgs e) 
1804                 {
1805                         DataGrid DataGrid1 = (DataGrid) source;
1806                         MyDataSource ds = new MyDataSource ();
1807                         TextBox edittedName = (TextBox) e.Item.Cells [1].Controls [0];
1808                         ds.UpdateItem (e.Item.DataSetIndex, Int32.Parse (e.Item.Cells [0].Text), edittedName.Text);
1809                         DataGrid1.EditItemIndex = -1;
1810                         DataGrid1.DataBind ();
1811                 }
1812
1813                 public static void DataGrid1_CancelCommand (object source, DataGridCommandEventArgs e) 
1814                 {
1815                         DataGrid DataGrid1 = (DataGrid) source;
1816                         DataGrid1.EditItemIndex = -1;
1817                         DataGrid1.DataBind ();
1818                 }
1819
1820                 public class MyDataSource
1821                 {
1822                         private static ArrayList _data;
1823
1824                         static MyDataSource () 
1825                         {
1826                                 Init ();
1827                         }
1828
1829                         public static void Init ()
1830                         {
1831                                 _data = new ArrayList ();
1832                                 _data.Add (new MyDataItem (1, "heh1", "Comment 1"));
1833                                 _data.Add (new MyDataItem (2, "heh2", "Comment 2"));
1834                                 _data.Add (new MyDataItem (3, "heh3", "Comment 3"));
1835                                 _data.Add (new MyDataItem (4, "heh4", "Comment 4"));
1836                                 _data.Add (new MyDataItem (5, "heh5", "Comment 5"));
1837                                 _data.Add (new MyDataItem (6, "heh6", "Comment 6"));
1838                                 _data.Add (new MyDataItem (7, "heh7", "Comment 7"));
1839                                 _data.Add (new MyDataItem (8, "heh8", "Comment 8"));
1840                                 _data.Add (new MyDataItem (9, "heh9", "Comment 9"));
1841                                 _data.Add (new MyDataItem (10, "heh10", "Comment 10"));
1842                         }
1843
1844                         public MyDataSource () 
1845                         {
1846                         }
1847
1848                         public ArrayList GetAllItems () 
1849                         {
1850                                 return _data;
1851                         }
1852
1853                         public int GetCount () 
1854                         {
1855                                 return _data.Count;
1856                         }
1857
1858                         public void UpdateItem (int itemIndex, int id, string name) 
1859                         {
1860                                 if (itemIndex >= 0 && itemIndex < _data.Count) {
1861                                         MyDataItem item = (MyDataItem) _data [itemIndex];
1862                                         item.Name = name;
1863                                         return;
1864                                 }
1865                         }
1866
1867                         public void DeleteItem (int p) 
1868                         {
1869                                 _data.RemoveAt (p);
1870                         }
1871                 }
1872
1873                 public class MyDataItem
1874                 {
1875                         int _id = 0;
1876                         string _name = "";
1877                         string _comment = "";
1878
1879                         public MyDataItem (int id, string name, string comment) 
1880                         {
1881                                 _id = id;
1882                                 _name = name;
1883                                 _comment = comment;
1884                         }
1885
1886                         public int ID {
1887                                 get { return _id; }
1888                         }
1889
1890                         public string Name {
1891                                 get { return _name; }
1892                                 set { _name = value; }
1893                         }
1894
1895                         public string Comment {
1896                                 get { return _comment; }
1897                                 set { _comment = value; }
1898                         }
1899                 }
1900
1901
1902                 class MyTemplate : ITemplate {
1903                         string text;
1904                         public MyTemplate (string text)
1905                         {
1906                                 this.text = text;
1907                         }
1908
1909                         public void InstantiateIn (Control control)
1910                         {
1911                                 control.Controls.Add (new LiteralControl (text));       
1912                         }
1913                 }
1914
1915                 [Test]
1916                 public void OneTemplateColumn1 ()
1917                 {
1918                         DataGridPoker p = new DataGridPoker ();
1919                         TemplateColumn tc = new TemplateColumn ();
1920                         tc.ItemTemplate = new MyTemplate ("hola");
1921                         p.Columns.Add (tc);
1922                         ControlCollection controls = p.Controls;
1923                         p.CreateControls (true);
1924                         Assert.AreEqual (1, p.Columns.Count, "columns");
1925                         Assert.AreEqual (0, controls.Count, "controls");
1926                         string render = p.Render ();
1927                         // no items, even with a templated column.
1928                         // The table is not added if DataSource == null
1929                         Assert.IsTrue (-1 == render.IndexOf ("hola"), "template");
1930                 }
1931
1932                 [Test]
1933                 public void OneTemplateColumn2 ()
1934                 {
1935                         DataGridPoker p = new DataGridPoker ();
1936                         p.ShowFooter = true;
1937                         p.AutoGenerateColumns = false;
1938                         p.DataSource = new ArrayList ();
1939                         TemplateColumn tc = new TemplateColumn ();
1940                         tc.HeaderText = " ";
1941                         tc.FooterTemplate = new MyTemplate ("hola");
1942                         p.Columns.Add (tc);
1943                         Assert.AreEqual (1, p.Columns.Count, "columns-1");
1944                         Assert.AreEqual (0, p.Controls.Count, "controls-1");
1945                         p.CreateControls (true);
1946                         // This time we have the table there. Thanks to the empty ArrayList
1947                         Assert.AreEqual (1, p.Columns.Count, "columns-2");
1948                         Assert.AreEqual (1, p.Controls.Count, "controls-2");
1949                         p.PrepareCH ();
1950                         Assert.AreEqual (1, p.Columns.Count, "columns-3");
1951                         Assert.AreEqual (1, p.Controls.Count, "controls-3");
1952                 }
1953
1954                 [Test]
1955                 public void OneTemplateColumn3 ()
1956                 {
1957                         DataGridPoker p = new DataGridPoker ();
1958                         p.ShowFooter = true;
1959                         p.AutoGenerateColumns = false;
1960                         p.DataSource = new ArrayList ();
1961                         TemplateColumn tc = new TemplateColumn ();
1962                         tc.FooterTemplate = new MyTemplate ("hola");
1963                         p.Columns.Add (tc);
1964                         p.DataBind ();
1965
1966                         StringWriter sw = new StringWriter ();
1967                         HtmlTextWriter tw = new HtmlTextWriter (sw);
1968                         Assert.AreEqual (1, p.Columns.Count, "columns");
1969                         Assert.AreEqual (1, p.Controls.Count, "controls");
1970
1971                         string render = p.Render ();
1972                         // no items, but we have a footer
1973                         Assert.IsTrue (-1 != render.IndexOf ("hola"), "template");
1974                 }
1975
1976                 // This one throw nullref on MS and works with mono
1977                 /*
1978                 [Test]
1979                 [NUnit.Framework.CategoryAttribute ("NotDotNet")]
1980                 public void OneTemplateColumn4 ()
1981                 {
1982                         DataGridPoker p = new DataGridPoker ();
1983                         TemplateColumn tc = new TemplateColumn ();
1984                         tc.ItemTemplate = new MyTemplate ("hola");
1985                         p.Columns.Add (tc);
1986                         p.DataSource = new ArrayList ();
1987                         p.CreateControls (false);
1988                         Assert.AreEqual (1, p.Columns.Count, "columns");
1989                         // Table added because useDataSource == false...
1990                         Assert.AreEqual (1, p.Controls.Count, "controls");
1991                         string render = p.Render ();
1992                         // ... but no template rendered.
1993                         Assert.IsTrue (-1 == render.IndexOf ("hola"), "template");
1994                 }
1995                 */
1996
1997                 [Test]
1998                 public void CreateControls ()
1999                 {
2000                         DataGridPoker p = new DataGridPoker ();
2001                         DataTable table = new DataTable ();
2002
2003                         table.Columns.Add (new DataColumn ("one", typeof (string)));
2004                         table.Columns.Add (new DataColumn ("two", typeof (string)));
2005                         table.Columns.Add (new DataColumn ("three", typeof (string)));
2006                         table.Rows.Add (new object [] { "1", "2", "3" });
2007                         
2008                         p.DataSource = new DataView (table);
2009
2010                         p.CreateControls (true);
2011                         Assert.AreEqual (p.Controls.Count, 1, "A1");
2012
2013                         ShowControlsRecursive (p.Controls [0], 1);
2014                 }
2015
2016                 [Test]
2017                 public void CreationEvents ()
2018                 {
2019                         DataGridPoker p = new DataGridPoker ();
2020                         DataTable table = new DataTable ();
2021
2022                         table.Columns.Add (new DataColumn ("one", typeof (string)));
2023                         table.Columns.Add (new DataColumn ("two", typeof (string)));
2024                         table.Columns.Add (new DataColumn ("three", typeof (string)));
2025                         
2026                         p.DataSource = new DataView (table);
2027
2028                         p.ItemCreated += new DataGridItemEventHandler (ItemCreatedHandler);
2029                         p.ItemDataBound += new DataGridItemEventHandler (ItemDataBoundHandler);
2030
2031                         // No items added yet
2032                         ResetEvents ();
2033                         p.CreateControls (true);
2034                         Assert.IsTrue (item_created, "A1");
2035                         Assert.IsTrue (item_data_bound, "A2");
2036
2037                         table.Rows.Add (new object [] { "1", "2", "3" });
2038
2039                         ResetEvents ();
2040                         p.CreateControls (true);
2041                         Assert.IsTrue (item_created, "A3");
2042                         Assert.IsTrue (item_data_bound, "A4");
2043
2044                         // no databinding
2045                         ResetEvents ();
2046                         p.CreateControls (false);
2047                         Assert.IsTrue (item_created, "A5");
2048                         Assert.IsFalse (item_data_bound, "A6");
2049                 }
2050
2051                 [Test]
2052                 public void InitializePager ()
2053                 {
2054                         DataGridPoker p = new DataGridPoker ();
2055                         PagedDataSource paged = new PagedDataSource ();
2056                         DataTable table = new DataTable ();
2057                         DataGridItem item = new DataGridItem (-1, -1, ListItemType.Pager);
2058                         ArrayList columns;
2059                         LinkButton next;
2060                         LinkButton prev;
2061
2062                         table.Columns.Add (new DataColumn ("one", typeof (string)));
2063                         table.Columns.Add (new DataColumn ("two", typeof (string)));
2064                         table.Columns.Add (new DataColumn ("three", typeof (string)));
2065
2066                         for (int i = 0; i < 25; i++)
2067                                 table.Rows.Add (new object [] { "1", "2", "3" });
2068                         paged.DataSource = new DataView (table);
2069
2070                         columns = p.CreateColumns (paged, true);
2071                         p.InitPager (item, columns.Count, paged);
2072
2073                         //
2074                         // No where to go
2075                         //
2076
2077                         Assert.AreEqual (item.Controls.Count, 1, "A1");
2078                         Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A2");
2079                         Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A3");
2080                         Assert.AreEqual (item.Controls [0].Controls [0].GetType (), typeof (Label), "A4");
2081                         Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2082                                         typeof (LiteralControl), "A5");
2083                         Assert.AreEqual (item.Controls [0].Controls [2].GetType (), typeof (Label), "A6");
2084                         Assert.AreEqual (((Label) item.Controls [0].Controls [0]).Text, "&lt;", "A7");
2085                         Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2086                                         "&nbsp;", "A7");
2087                         Assert.AreEqual (((Label) item.Controls [0].Controls [2]).Text, "&gt;", "A8");
2088
2089                         //
2090                         // Next
2091                         //
2092
2093                         item = new DataGridItem (-1, -1, ListItemType.Pager);
2094                         paged.PageSize = 5;
2095                         paged.VirtualCount = 25;
2096                         paged.AllowPaging = true;
2097                         p.InitPager (item, columns.Count, paged);
2098
2099                         Assert.AreEqual (item.Controls.Count, 1, "A9");
2100                         Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A10");
2101                         Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A11");
2102                         Assert.AreEqual (item.Controls [0].Controls [0].GetType (), typeof (Label), "A12");
2103                         Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2104                                         typeof (LiteralControl), "A13");
2105                         Assert.AreEqual (((Label) item.Controls [0].Controls [0]).Text, "&lt;", "A14");
2106                         Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2107                                         "&nbsp;", "A16");
2108
2109                         next = (LinkButton) item.Controls [0].Controls [2];
2110                         Assert.AreEqual (next.Text, "&gt;", "A17");
2111                         Assert.AreEqual (next.CommandName, "Page", "A18");
2112                         Assert.AreEqual (next.CommandArgument, "Next", "A19");
2113
2114
2115                         //
2116                         // Both
2117                         //
2118
2119                         item = new DataGridItem (-1, -1, ListItemType.Pager);
2120                         paged.PageSize = 5;
2121                         paged.VirtualCount = 25;
2122                         paged.AllowPaging = true;
2123                         paged.CurrentPageIndex = 2;
2124                         p.InitPager (item, columns.Count, paged);
2125
2126                         Assert.AreEqual (item.Controls.Count, 1, "A20");
2127                         Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A21");
2128                         Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A22");
2129                         Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2130                                         typeof (LiteralControl), "A23");
2131                         Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2132                                         "&nbsp;", "A24");
2133
2134                         // This is failing with an invalidcast right now. It's something related to
2135                         // the pager thinking that it's on the last page and rendering a label instead
2136                         next = (LinkButton) item.Controls [0].Controls [2];
2137                         Assert.AreEqual (next.Text, "&gt;", "A25");
2138                         Assert.AreEqual (next.CommandName, "Page", "A26");
2139                         Assert.AreEqual (next.CommandArgument, "Next", "A27");
2140
2141                         prev = (LinkButton) item.Controls [0].Controls [0];
2142                         Assert.AreEqual (prev.Text, "&lt;", "A28");
2143                         Assert.AreEqual (prev.CommandName, "Page", "A29");
2144                         Assert.AreEqual (prev.CommandArgument, "Prev", "A30");
2145
2146                         //
2147                         // Back only
2148                         //
2149
2150                         item = new DataGridItem (-1, -1, ListItemType.Pager);
2151                         paged.PageSize = 5;
2152                         paged.VirtualCount = 25;
2153                         paged.AllowPaging = true;
2154                         paged.CurrentPageIndex = 4;
2155                         p.InitPager (item, columns.Count, paged);
2156
2157                         Assert.AreEqual (item.Controls.Count, 1, "A31");
2158                         Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A32");
2159                         Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A33");
2160                         Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2161                                         typeof (LiteralControl), "A34");
2162                         Assert.AreEqual (item.Controls [0].Controls [2].GetType (), typeof (Label), "A35");
2163                         Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2164                                         "&nbsp;", "A36");
2165                         Assert.AreEqual (((Label) item.Controls [0].Controls [2]).Text, "&gt;", "A37");
2166
2167                         prev = (LinkButton) item.Controls [0].Controls [0];
2168                         Assert.AreEqual (prev.Text, "&lt;", "A38");
2169                         Assert.AreEqual (prev.CommandName, "Page", "A39");
2170                         Assert.AreEqual (prev.CommandArgument, "Prev", "A40");
2171
2172                 }
2173
2174                 [Conditional ("VERBOSE_DATAGRID")]
2175                 private void ShowControlsRecursive (Control c, int depth)
2176                 {
2177                         for (int i = 0; i < depth; i++)
2178                                 Console.Write ("-");
2179
2180                         // StringWriter sw = new StringWriter ();
2181                         // HtmlTextWriter tw = new HtmlTextWriter (sw);
2182
2183                         // c.RenderControl (tw);
2184                         // Console.WriteLine (sw.ToString ());
2185
2186                         Console.WriteLine (c);
2187
2188                         foreach (Control child in c.Controls)
2189                                 ShowControlsRecursive (child, depth + 5);
2190                 }
2191
2192                 [Test]
2193                 public void Render ()
2194                 {
2195                         DataGridPoker p = new DataGridPoker ();
2196
2197                         Assert.AreEqual (p.Render (), String.Empty, "A1");
2198                 }
2199
2200                 Control FindByType (Control parent, Type type)
2201                 {
2202                         if (!parent.HasControls ())
2203                                 return null;
2204
2205                         foreach (Control c in parent.Controls) {
2206                                 if (type.IsAssignableFrom (c.GetType ()))
2207                                         return c;
2208
2209                                 Control ret = FindByType (c, type);
2210                                 if (ret != null)
2211                                         return ret;
2212                         }
2213                         return null;
2214                 }
2215
2216                 // Header link
2217                 [Test]
2218                 public void SpecialLinkButton1 ()
2219                 {
2220                         DataTable dt = new DataTable();
2221                         dt.Columns.Add (new DataColumn("something", typeof(Int32)));
2222                         DataRow dr = dt.NewRow ();
2223                         dt.Rows.Add (new object [] { 1 });
2224                         DataView dv = new DataView (dt);
2225                         DataGridPoker dg = new DataGridPoker ();
2226                         dg.AllowSorting = true;
2227                         dg.HeaderStyle.Font.Bold = true;
2228                         dg.HeaderStyle.ForeColor = Color.FromArgb (255,255,255,255);
2229                         dg.HeaderStyle.BackColor = Color.FromArgb (33,33,33,33);
2230                         dg.DataSource = dv;
2231                         dg.DataBind ();
2232                         LinkButton lb = (LinkButton) FindByType (dg.Controls [0], typeof (LinkButton));
2233                         Assert.IsNotNull (lb, "lb");
2234                         StringWriter sr = new StringWriter ();
2235                         HtmlTextWriter output = new HtmlTextWriter (sr);
2236                         // Nothing here...
2237                         Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore");
2238                         lb.RenderControl (output);
2239                         // Nothing here...
2240                         Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore2");
2241                         dg.Render ();
2242                         // Surprise! after rendering the datagrid, the linkbutton has the ForeColor from the datagrid
2243                         Assert.AreEqual (Color.FromArgb (255,255,255,255), lb.ControlStyle.ForeColor, "fore3");
2244
2245                         // Extra. Items != empty
2246                         Assert.AreEqual (1, dg.Items.Count, "itemCount");
2247                 }
2248
2249                 // value link in buttoncolumn
2250                 [Test]
2251                 public void SpecialLinkButton2 ()
2252                 {
2253                         DataTable dt = new DataTable();
2254                         dt.Columns.Add (new DataColumn("string_col", typeof(string)));
2255                         DataRow dr = dt.NewRow ();
2256                         dt.Rows.Add (new object [] { "Item 1" });
2257                         DataView dv = new DataView (dt);
2258
2259                         DataGridPoker dg = new DataGridPoker ();
2260                         dg.DataSource = dv;
2261                         dg.AutoGenerateColumns = false;
2262                         dg.HeaderStyle.ForeColor = Color.FromArgb (255,255,255,255);
2263                         dg.HeaderStyle.BackColor = Color.FromArgb (33,33,33,33);
2264
2265                         ButtonColumn bc = new ButtonColumn ();
2266                         bc.HeaderText = "Some header";
2267                         bc.DataTextField = "string_col";
2268                         bc.CommandName = "lalala";
2269                         dg.Columns.Add (bc);
2270
2271                         BoundColumn bound = new BoundColumn ();
2272                         bound.HeaderText = "The other column";
2273                         bound.DataField = "string_col";
2274                         dg.Columns.Add (bound);
2275
2276                         dg.DataBind ();
2277
2278                         LinkButton lb = (LinkButton) FindByType (dg.Controls [0], typeof (LinkButton));
2279                         Assert.IsNotNull (lb, "lb");
2280                         StringWriter sr = new StringWriter ();
2281                         HtmlTextWriter output = new HtmlTextWriter (sr);
2282                         Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore");
2283                         lb.RenderControl (output);
2284                         Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore2");
2285                         string str = dg.Render ();
2286                         Assert.IsTrue (-1 != str.IndexOf ("<a>Item 1</a>"), "item1");
2287                         Assert.IsTrue (-1 != str.IndexOf ("<td>Item 1</td>"), "item1-2");
2288                 }
2289         }
2290 }
2291