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 
DataGridPoker()52 		public DataGridPoker ()
53 		{
54 			TrackViewState ();
55 		}
56 
GetTagName()57 		public string GetTagName ()
58 		{
59 			return TagName;
60 		}
61 
PrepareCH()62 		public void PrepareCH ()
63 		{
64 			PrepareControlHierarchy ();
65 		}
66 
Render()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 
GetViewState()76 		public StateBag GetViewState ()
77 		{
78 			return ViewState;
79 		}
80 
ControlStyle()81 		public new Style ControlStyle ()
82 		{
83 			return CreateControlStyle ();
84 		}
85 
DoCancelCommand(DataGridCommandEventArgs e)86 		public void DoCancelCommand (DataGridCommandEventArgs e)
87 		{
88 			OnCancelCommand (e);
89 		}
90 
DoDeleteCommand(DataGridCommandEventArgs e)91 		public void DoDeleteCommand (DataGridCommandEventArgs e)
92 		{
93 			OnDeleteCommand (e);
94 		}
95 
DoEditCommand(DataGridCommandEventArgs e)96 		public void DoEditCommand (DataGridCommandEventArgs e)
97 		{
98 			OnEditCommand (e);
99 		}
100 
DoItemCommand(DataGridCommandEventArgs e)101 		public void DoItemCommand (DataGridCommandEventArgs e)
102 		{
103 			OnItemCommand (e);
104 		}
105 
DoUpdateCommand(DataGridCommandEventArgs e)106 		public void DoUpdateCommand (DataGridCommandEventArgs e)
107 		{
108 			OnUpdateCommand (e);
109 		}
110 
DoItemCreated(DataGridItemEventArgs e)111 		public void DoItemCreated (DataGridItemEventArgs e)
112 		{
113 			OnItemCreated (e);
114 		}
115 
DoItemDataBound(DataGridItemEventArgs e)116 		public void DoItemDataBound (DataGridItemEventArgs e)
117 		{
118 			OnItemDataBound (e);
119 		}
120 
DoPageIndexChanged(DataGridPageChangedEventArgs e)121 		public void DoPageIndexChanged (DataGridPageChangedEventArgs e)
122 		{
123 			OnPageIndexChanged (e);
124 		}
125 
DoSortCommand(DataGridSortCommandEventArgs e)126 		public void DoSortCommand (DataGridSortCommandEventArgs e)
127 		{
128 			OnSortCommand (e);
129 		}
130 
DoBubbleEvent(object source, EventArgs e)131 		public void DoBubbleEvent (object source, EventArgs e)
132 		{
133 			OnBubbleEvent (source, e);
134 		}
135 
TrackState()136 		public void TrackState ()
137 		{
138 			TrackViewState ();
139 		}
140 
SaveState()141 		public object SaveState ()
142 		{
143 			return SaveViewState ();
144 		}
145 
CreateColumns(PagedDataSource data_source, bool use_data_source)146 		public ArrayList CreateColumns (PagedDataSource data_source, bool use_data_source)
147 		{
148 			return CreateColumnSet (data_source, use_data_source);
149 		}
150 
CreateControls(bool use_data_source)151 		public void CreateControls (bool use_data_source)
152 		{
153 			CreateControlHierarchy (use_data_source);
154 		}
155 
InitPager(DataGridItem item, int columnSpan, PagedDataSource pagedDataSource)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 
AmazingEnumerable(IList list)168 		public AmazingEnumerable (IList list)
169 		{
170 			this.list = list;
171 		}
172 
GetEnumerator()173 		public IEnumerator GetEnumerator ()
174 		{
175 			CallCount++;
176 			return list.GetEnumerator ();
177 		}
178 
179 	}
180 
181 	[TestFixture]
182 	public class DataGridTest {
183 
184 		[TestFixtureSetUp()]
FixtureSetup()185 		public void FixtureSetup ()
186 		{
187 			WebTest.CopyResource (GetType (), "DataGrid.aspx", "DataGrid.aspx");
188 		}
189 
190 		[TestFixtureTearDown()]
FixtureTearDown()191 		public void FixtureTearDown ()
192 		{
193 			WebTest.Unload ();
194 		}
195 
196 		[Test]
Defaults()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]
TagName()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))]
NullBackImage()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]
CleanProperties()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))]
CurrentPageIndexTooLow()313 		public void CurrentPageIndexTooLow ()
314 		{
315 			DataGridPoker p = new DataGridPoker ();
316 			p.CurrentPageIndex = -1;
317 		}
318 
319 		[Test]
320 		[ExpectedException (typeof (ArgumentOutOfRangeException))]
EditItemIndexTooLow()321 		public void EditItemIndexTooLow ()
322 		{
323 			DataGridPoker p = new DataGridPoker ();
324 			p.EditItemIndex = -2;
325 		}
326 
327 		[Test]
328 		[ExpectedException (typeof (ArgumentOutOfRangeException))]
PageSizeTooLow()329 		public void PageSizeTooLow ()
330 		{
331 			DataGridPoker p = new DataGridPoker ();
332 			p.PageSize = 0;
333 		}
334 
335 		[Test]
336 		[ExpectedException (typeof (ArgumentOutOfRangeException))]
SelectedIndexTooLow()337 		public void SelectedIndexTooLow ()
338 		{
339 			DataGridPoker p = new DataGridPoker ();
340 			p.SelectedIndex = -2;
341 		}
342 
343 		[Test]
344 		[ExpectedException (typeof (ArgumentOutOfRangeException))]
VirtualItemCountTooLow()345 		public void VirtualItemCountTooLow ()
346 		{
347 			DataGridPoker p = new DataGridPoker ();
348 			p.VirtualItemCount = -1;
349 		}
350 
351 		[Test]
ViewState()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]
SelectIndexOutOfRange()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))]
SelectItemOutOfRange()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]
ControlStyle()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]
Styles()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 
ResetEvents()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 
CancelCommandHandler(object sender, DataGridCommandEventArgs e)497 		private void CancelCommandHandler (object sender, DataGridCommandEventArgs e)
498 		{
499 			cancel_command = true;
500 		}
501 
DeleteCommandHandler(object sender, DataGridCommandEventArgs e)502 		private void DeleteCommandHandler (object sender, DataGridCommandEventArgs e)
503 		{
504 			delete_command = true;
505 		}
506 
EditCommandHandler(object sender, DataGridCommandEventArgs e)507 		private void EditCommandHandler (object sender, DataGridCommandEventArgs e)
508 		{
509 			edit_command = true;
510 		}
511 
ItemCommandHandler(object sender, DataGridCommandEventArgs e)512 		private void ItemCommandHandler (object sender, DataGridCommandEventArgs e)
513 		{
514 			item_command = true;
515 		}
516 
UpdateCommandHandler(object sender, DataGridCommandEventArgs e)517 		private void UpdateCommandHandler (object sender, DataGridCommandEventArgs e)
518 		{
519 			update_command = true;
520 		}
521 
ItemCreatedHandler(object sender, DataGridItemEventArgs e)522 		private void ItemCreatedHandler (object sender, DataGridItemEventArgs e)
523 		{
524 			item_created = true;
525 		}
526 
ItemDataBoundHandler(object sender, DataGridItemEventArgs e)527 		private void ItemDataBoundHandler (object sender, DataGridItemEventArgs e)
528 		{
529 			item_data_bound = true;
530 		}
531 
PageIndexChangedHandler(object sender, DataGridPageChangedEventArgs e)532 		private void PageIndexChangedHandler (object sender, DataGridPageChangedEventArgs e)
533 		{
534 			page_index_changed = true;
535 			new_page_index = e.NewPageIndex;
536 		}
537 
SortCommandHandler(object sender, DataGridSortCommandEventArgs e)538 		private void SortCommandHandler (object sender, DataGridSortCommandEventArgs e)
539 		{
540 			sort_command = true;
541 		}
542 
SelectedIndexChangedHandler(object sender, EventArgs e)543 		private void SelectedIndexChangedHandler (object sender, EventArgs e)
544 		{
545 			selected_changed = true;
546 		}
547 
548 		[Test]
Events()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]
BubbleEvent()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]
BubblePageCommand()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))]
BadBubblePageArg()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))]
BadBubblePageArg2()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]
SaveViewState()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]
CreateColumnSet()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]
CreateColumnsBinding()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]
CreateSimpleColumns()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]
DataBindingEnumerator()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 {
GetAttributes()1192 			public AttributeCollection GetAttributes ()
1193 			{
1194 				throw new Exception ();
1195 			}
1196 
GetClassName()1197 			public string GetClassName()
1198 			{
1199 				throw new Exception ();
1200 			}
1201 
GetComponentName()1202 			public string GetComponentName()
1203 			{
1204 				throw new Exception ();
1205 			}
1206 
GetConverter()1207 			public TypeConverter GetConverter()
1208 			{
1209 				throw new Exception ();
1210 			}
1211 
GetDefaultEvent()1212 			public EventDescriptor GetDefaultEvent()
1213 			{
1214 				throw new Exception ();
1215 			}
1216 
GetDefaultProperty()1217 			public PropertyDescriptor GetDefaultProperty()
1218 			{
1219 				throw new Exception ();
1220 			}
1221 
GetEditor(Type editorBaseType)1222 			public object GetEditor (Type editorBaseType)
1223 			{
1224 				throw new Exception ();
1225 			}
1226 
GetEvents()1227 			public EventDescriptorCollection GetEvents ()
1228 			{
1229 				throw new Exception ();
1230 			}
1231 
GetEvents(Attribute[] arr)1232 			public EventDescriptorCollection GetEvents (Attribute[] arr)
1233 			{
1234 				throw new Exception ();
1235 			}
1236 
1237 			public int CallCount;
GetProperties()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 
GetProperties(Attribute[] arr)1248 			public PropertyDescriptorCollection GetProperties (Attribute[] arr)
1249 			{
1250 				// We call this one
1251 				return GetProperties ();
1252 			}
1253 
GetPropertyOwner(PropertyDescriptor pd)1254 			public object GetPropertyOwner (PropertyDescriptor pd)
1255 			{
1256 				throw new Exception ();
1257 			}
1258 		}
1259 
1260 		class MyPropertyDescriptor : PropertyDescriptor {
1261 			int val;
1262 
MyPropertyDescriptor()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 
GetValue(object component)1279 			public override object GetValue (object component)
1280 			{
1281 				return val++;
1282 			}
1283 
SetValue(object component, object value)1284 			public override void SetValue (object component, object value)
1285 			{
1286 			}
1287 
ResetValue(object component)1288 			public override void ResetValue (object component)
1289 			{
1290 			}
1291 
CanResetValue(object component)1292 			public override bool CanResetValue (object component)
1293 			{
1294 				return false;
1295 			}
1296 
ShouldSerializeValue(object component)1297 			public override bool ShouldSerializeValue (object component)
1298 			{
1299 				return false;
1300 			}
1301 		}
1302 
1303 		class MyEnumerable : IEnumerable {
1304 			public object Item;
GetEnumerator()1305 			public IEnumerator GetEnumerator ()
1306 			{
1307 				ArrayList list = new ArrayList ();
1308 				list.Add (Item);
1309 				return list.GetEnumerator ();
1310 			}
1311 		}
1312 
1313 		[Test]
DataBindingCustomElement()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 
data()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 
data()1345 			public data () {
1346 			}
1347 
GetAllItems()1348 			public ArrayList GetAllItems () {
1349 				return _data;
1350 			}
1351 
GetPagedItems(int startIndex, int maxRows)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 
GetCount()1365 			public int GetCount ()
1366 			{
1367 				return _data.Count;
1368 			}
1369 
UpdateItem(int id, string name)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 
DataItem(int id, string name)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 		{
GetList(string sortExpression, int startRowIndex, int maximumRows)1402 			public static List<string> GetList (string sortExpression, int startRowIndex, int maximumRows) {
1403 				return GetList ();
1404 			}
1405 
GetList(int startRowIndex, int maximumRows)1406 			public static List<string> GetList (int startRowIndex, int maximumRows) {
1407 				return GetList ();
1408 			}
1409 
GetList(string sortExpression)1410 			public static List<string> GetList (string sortExpression) {
1411 				return GetList ();
1412 			}
1413 
GetList()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 
GetCount()1425 			public static int GetCount () {
1426 				return GetList ().Count;
1427 			}
1428 		}
1429 
1430 		[Test]
1431 		[ExpectedException(typeof(InvalidOperationException))]
DataSourceAndDataSourceID()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]
DataBindingDataSourceID()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")]
DataBindingDataSourceIDAutomatic()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 
DataSourceIDAutomatic_Load(Page page)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 
DataSourceIDAutomatic_PreRender(Page page)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]
DataSourceIDBindingNoColumns()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]
DataSourceIDBindingManualColumns()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")]
Paging()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 			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>";
1581 
1582 			HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid initial Render");
1583 
1584 			FormRequest fr = new FormRequest (t.Response, "form1");
1585 			fr.Controls.Add ("__EVENTTARGET");
1586 			fr.Controls.Add ("__EVENTARGUMENT");
1587 #if DOT_NET
1588 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl09$ctl01";
1589 #else
1590 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl08$ctl01";
1591 #endif
1592 			fr.Controls ["__EVENTARGUMENT"].Value = "";
1593 			t.Request = fr;
1594 
1595 			html = t.Run ();
1596 			gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1597 			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>";
1598 			HtmlDiff.AssertAreEqual (expectedSecondPage, gridHtml, "DataGrid Paging Next");
1599 
1600 			fr = new FormRequest (t.Response, "form1");
1601 			fr.Controls.Add ("__EVENTTARGET");
1602 			fr.Controls.Add ("__EVENTARGUMENT");
1603 #if DOT_NET
1604 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl09$ctl00";
1605 #else
1606 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl08$ctl00";
1607 #endif
1608 			fr.Controls ["__EVENTARGUMENT"].Value = "";
1609 			t.Request = fr;
1610 
1611 			html = t.Run ();
1612 			gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1613 
1614 			HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid Paging Previous");
1615 		}
1616 
1617 		[Test]
1618 		[NUnit.Framework.Category ("NunitWeb")]
EditUpdateDelete()1619 		public void EditUpdateDelete ()
1620 		{
1621 			WebTest t = new WebTest ("DataGrid.aspx");
1622 			t.Invoker = PageInvoker.CreateOnInit (DataGrid_OnInit);
1623 			string html = t.Run ();
1624 			string gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1625 			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>";
1626 
1627 			HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid initial Render");
1628 
1629 			FormRequest fr = new FormRequest (t.Response, "form1");
1630 			fr.Controls.Add ("__EVENTTARGET");
1631 			fr.Controls.Add ("__EVENTARGUMENT");
1632 #if DOT_NET
1633 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl03$ctl00";
1634 #else
1635 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl02$ctl00";
1636 #endif
1637 			fr.Controls ["__EVENTARGUMENT"].Value = "";
1638 			t.Request = fr;
1639 
1640 			html = t.Run ();
1641 			gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1642 			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>";
1643 			HtmlDiff.AssertAreEqual (expectedSecondPage, gridHtml, "DataGrid Edit");
1644 
1645 			fr = new FormRequest (t.Response, "form1");
1646 			fr.Controls.Add ("__EVENTTARGET");
1647 			fr.Controls.Add ("__EVENTARGUMENT");
1648 #if DOT_NET
1649 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl03$ctl01";
1650 #else
1651 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl02$ctl01";
1652 #endif
1653 			fr.Controls ["__EVENTARGUMENT"].Value = "";
1654 #if DOT_NET
1655 			fr.Controls.Add ("DataGrid1$ctl03$ctl00");
1656 			fr.Controls ["DataGrid1$ctl03$ctl00"].Value = "New Value";
1657 #else
1658 			fr.Controls.Add ("DataGrid1$ctl02$ctl00");
1659 			fr.Controls ["DataGrid1$ctl02$ctl00"].Value = "New Value";
1660 #endif
1661 			t.Request = fr;
1662 
1663 			html = t.Run ();
1664 			gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1665 			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>";
1666 
1667 			HtmlDiff.AssertAreEqual (expectedThirdPage, gridHtml, "DataGrid Update");
1668 
1669 			fr = new FormRequest (t.Response, "form1");
1670 			fr.Controls.Add ("__EVENTTARGET");
1671 			fr.Controls.Add ("__EVENTARGUMENT");
1672 #if DOT_NET
1673 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl04$ctl01";
1674 #else
1675 			fr.Controls ["__EVENTTARGET"].Value = "DataGrid1$ctl03$ctl01";
1676 #endif
1677 			fr.Controls ["__EVENTARGUMENT"].Value = "";
1678 			t.Request = fr;
1679 
1680 			html = t.Run ();
1681 			gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1682 			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>";
1683 
1684 			HtmlDiff.AssertAreEqual (expectedFourthPage, gridHtml, "DataGrid Delete");
1685 		}
1686 
1687 		[Test]
1688 		[NUnit.Framework.Category ("NunitWeb")]
SelectedIndex()1689 		public void SelectedIndex ()
1690 		{
1691 			WebTest t = new WebTest ("DataGrid.aspx");
1692 			t.Invoker = PageInvoker.CreateOnInit (DataGrid_OnInit);
1693 			string html = t.Run ();
1694 			string gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1695 			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>";
1696 
1697 			HtmlDiff.AssertAreEqual (expectedFirstPage, gridHtml, "DataGrid initial Render");
1698 
1699 			FormRequest fr = new FormRequest (t.Response, "form1");
1700 			fr.Controls.Add ("__EVENTTARGET");
1701 			fr.Controls.Add ("__EVENTARGUMENT");
1702 			fr.Controls ["__EVENTTARGET"].Value = "Button1";
1703 			fr.Controls ["__EVENTARGUMENT"].Value = "";
1704 			t.Request = fr;
1705 
1706 			html = t.Run ();
1707 			gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1708 			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>";
1709 			HtmlDiff.AssertAreEqual (expectedSecondPage, gridHtml, "DataGrid Selected 1");
1710 
1711 			fr = new FormRequest (t.Response, "form1");
1712 			fr.Controls.Add ("__EVENTTARGET");
1713 			fr.Controls.Add ("__EVENTARGUMENT");
1714 			fr.Controls ["__EVENTTARGET"].Value = "Button1";
1715 			fr.Controls ["__EVENTARGUMENT"].Value = "";
1716 			t.Request = fr;
1717 
1718 			html = t.Run ();
1719 			gridHtml = HtmlDiff.GetControlFromPageHtml (html);
1720 			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>";
1721 
1722 			HtmlDiff.AssertAreEqual (expectedThirdPage, gridHtml, "DataGrid Selected 2");
1723 		}
1724 
DataGrid_OnInit(Page p)1725 		public static void DataGrid_OnInit (Page p)
1726 		{
1727 			if (!p.IsPostBack)
1728 				MyDataSource.Init ();
1729 			DataGrid DataGrid1 = (DataGrid)p.FindControl ("DataGrid1");
1730 			DataGrid1.PageIndexChanged += new DataGridPageChangedEventHandler (DataGrid1_PageIndexChanged);
1731 			DataGrid1.CancelCommand += new DataGridCommandEventHandler (DataGrid1_CancelCommand);
1732 			DataGrid1.DeleteCommand += new DataGridCommandEventHandler (DataGrid1_DeleteCommand);
1733 			DataGrid1.EditCommand += new DataGridCommandEventHandler (DataGrid1_EditCommand);
1734 			DataGrid1.UpdateCommand += new DataGridCommandEventHandler (DataGrid1_UpdateCommand);
1735 			DataGrid1.ItemCreated += new DataGridItemEventHandler (DataGrid1_ItemCreated);
1736 		}
1737 
DataGrid1_ItemCreated(object sender, DataGridItemEventArgs e)1738 		public static void DataGrid1_ItemCreated (object sender, DataGridItemEventArgs e)
1739 		{
1740 			if (e.Item.ItemType == ListItemType.Pager) {
1741 				e.Item.Cells [0].ColumnSpan = 4;
1742 			}
1743 		}
1744 
DataGrid1_PageIndexChanged(object source, DataGridPageChangedEventArgs e)1745 		public static void DataGrid1_PageIndexChanged (object source, DataGridPageChangedEventArgs e)
1746 		{
1747 			DataGrid DataGrid1 = (DataGrid) source;
1748 			DataGrid1.CurrentPageIndex = e.NewPageIndex;
1749 			DataGrid1.DataBind ();
1750 		}
1751 
DataGrid1_EditCommand(object source, DataGridCommandEventArgs e)1752 		public static void DataGrid1_EditCommand (object source, DataGridCommandEventArgs e)
1753 		{
1754 			DataGrid DataGrid1 = (DataGrid) source;
1755 			DataGrid1.EditItemIndex = e.Item.ItemIndex;
1756 			DataGrid1.DataBind ();
1757 		}
1758 
DataGrid1_DeleteCommand(object source, DataGridCommandEventArgs e)1759 		public static void DataGrid1_DeleteCommand (object source, DataGridCommandEventArgs e)
1760 		{
1761 			DataGrid DataGrid1 = (DataGrid) source;
1762 			MyDataSource ds = new MyDataSource ();
1763 			ds.DeleteItem (e.Item.DataSetIndex);
1764 			DataGrid1.DataBind ();
1765 		}
1766 
DataGrid1_UpdateCommand(object source, DataGridCommandEventArgs e)1767 		public static void DataGrid1_UpdateCommand (object source, DataGridCommandEventArgs e)
1768 		{
1769 			DataGrid DataGrid1 = (DataGrid) source;
1770 			MyDataSource ds = new MyDataSource ();
1771 			TextBox edittedName = (TextBox) e.Item.Cells [1].Controls [0];
1772 			ds.UpdateItem (e.Item.DataSetIndex, Int32.Parse (e.Item.Cells [0].Text), edittedName.Text);
1773 			DataGrid1.EditItemIndex = -1;
1774 			DataGrid1.DataBind ();
1775 		}
1776 
DataGrid1_CancelCommand(object source, DataGridCommandEventArgs e)1777 		public static void DataGrid1_CancelCommand (object source, DataGridCommandEventArgs e)
1778 		{
1779 			DataGrid DataGrid1 = (DataGrid) source;
1780 			DataGrid1.EditItemIndex = -1;
1781 			DataGrid1.DataBind ();
1782 		}
1783 
1784 		public class MyDataSource
1785 		{
1786 			private static ArrayList _data;
1787 
MyDataSource()1788 			static MyDataSource ()
1789 			{
1790 				Init ();
1791 			}
1792 
Init()1793 			public static void Init ()
1794 			{
1795 				_data = new ArrayList ();
1796 				_data.Add (new MyDataItem (1, "heh1", "Comment 1"));
1797 				_data.Add (new MyDataItem (2, "heh2", "Comment 2"));
1798 				_data.Add (new MyDataItem (3, "heh3", "Comment 3"));
1799 				_data.Add (new MyDataItem (4, "heh4", "Comment 4"));
1800 				_data.Add (new MyDataItem (5, "heh5", "Comment 5"));
1801 				_data.Add (new MyDataItem (6, "heh6", "Comment 6"));
1802 				_data.Add (new MyDataItem (7, "heh7", "Comment 7"));
1803 				_data.Add (new MyDataItem (8, "heh8", "Comment 8"));
1804 				_data.Add (new MyDataItem (9, "heh9", "Comment 9"));
1805 				_data.Add (new MyDataItem (10, "heh10", "Comment 10"));
1806 			}
1807 
MyDataSource()1808 			public MyDataSource ()
1809 			{
1810 			}
1811 
GetAllItems()1812 			public ArrayList GetAllItems ()
1813 			{
1814 				return _data;
1815 			}
1816 
GetCount()1817 			public int GetCount ()
1818 			{
1819 				return _data.Count;
1820 			}
1821 
UpdateItem(int itemIndex, int id, string name)1822 			public void UpdateItem (int itemIndex, int id, string name)
1823 			{
1824 				if (itemIndex >= 0 && itemIndex < _data.Count) {
1825 					MyDataItem item = (MyDataItem) _data [itemIndex];
1826 					item.Name = name;
1827 					return;
1828 				}
1829 			}
1830 
DeleteItem(int p)1831 			public void DeleteItem (int p)
1832 			{
1833 				_data.RemoveAt (p);
1834 			}
1835 		}
1836 
1837 		public class MyDataItem
1838 		{
1839 			int _id = 0;
1840 			string _name = "";
1841 			string _comment = "";
1842 
MyDataItem(int id, string name, string comment)1843 			public MyDataItem (int id, string name, string comment)
1844 			{
1845 				_id = id;
1846 				_name = name;
1847 				_comment = comment;
1848 			}
1849 
1850 			public int ID {
1851 				get { return _id; }
1852 			}
1853 
1854 			public string Name {
1855 				get { return _name; }
1856 				set { _name = value; }
1857 			}
1858 
1859 			public string Comment {
1860 				get { return _comment; }
1861 				set { _comment = value; }
1862 			}
1863 		}
1864 
1865 
1866 		class MyTemplate : ITemplate {
1867 			string text;
MyTemplate(string text)1868 			public MyTemplate (string text)
1869 			{
1870 				this.text = text;
1871 			}
1872 
InstantiateIn(Control control)1873 			public void InstantiateIn (Control control)
1874 			{
1875 				control.Controls.Add (new LiteralControl (text));
1876 			}
1877 		}
1878 
1879 		[Test]
OneTemplateColumn1()1880 		public void OneTemplateColumn1 ()
1881 		{
1882 			DataGridPoker p = new DataGridPoker ();
1883 			TemplateColumn tc = new TemplateColumn ();
1884 			tc.ItemTemplate = new MyTemplate ("hola");
1885 			p.Columns.Add (tc);
1886 			ControlCollection controls = p.Controls;
1887 			p.CreateControls (true);
1888 			Assert.AreEqual (1, p.Columns.Count, "columns");
1889 			Assert.AreEqual (0, controls.Count, "controls");
1890 			string render = p.Render ();
1891 			// no items, even with a templated column.
1892 			// The table is not added if DataSource == null
1893 			Assert.IsTrue (-1 == render.IndexOf ("hola"), "template");
1894 		}
1895 
1896 		[Test]
OneTemplateColumn2()1897 		public void OneTemplateColumn2 ()
1898 		{
1899 			DataGridPoker p = new DataGridPoker ();
1900 			p.ShowFooter = true;
1901 			p.AutoGenerateColumns = false;
1902 			p.DataSource = new ArrayList ();
1903 			TemplateColumn tc = new TemplateColumn ();
1904 			tc.HeaderText = " ";
1905 			tc.FooterTemplate = new MyTemplate ("hola");
1906 			p.Columns.Add (tc);
1907 			Assert.AreEqual (1, p.Columns.Count, "columns-1");
1908 			Assert.AreEqual (0, p.Controls.Count, "controls-1");
1909 			p.CreateControls (true);
1910 			// This time we have the table there. Thanks to the empty ArrayList
1911 			Assert.AreEqual (1, p.Columns.Count, "columns-2");
1912 			Assert.AreEqual (1, p.Controls.Count, "controls-2");
1913 			p.PrepareCH ();
1914 			Assert.AreEqual (1, p.Columns.Count, "columns-3");
1915 			Assert.AreEqual (1, p.Controls.Count, "controls-3");
1916 		}
1917 
1918 		[Test]
OneTemplateColumn3()1919 		public void OneTemplateColumn3 ()
1920 		{
1921 			DataGridPoker p = new DataGridPoker ();
1922 			p.ShowFooter = true;
1923 			p.AutoGenerateColumns = false;
1924 			p.DataSource = new ArrayList ();
1925 			TemplateColumn tc = new TemplateColumn ();
1926 			tc.FooterTemplate = new MyTemplate ("hola");
1927 			p.Columns.Add (tc);
1928 			p.DataBind ();
1929 
1930 			StringWriter sw = new StringWriter ();
1931 			HtmlTextWriter tw = new HtmlTextWriter (sw);
1932 			Assert.AreEqual (1, p.Columns.Count, "columns");
1933 			Assert.AreEqual (1, p.Controls.Count, "controls");
1934 
1935 			string render = p.Render ();
1936 			// no items, but we have a footer
1937 			Assert.IsTrue (-1 != render.IndexOf ("hola"), "template");
1938 		}
1939 
1940 		// This one throw nullref on MS and works with mono
1941 		/*
1942 		[Test]
1943 		[NUnit.Framework.CategoryAttribute ("NotDotNet")]
1944 		public void OneTemplateColumn4 ()
1945 		{
1946 			DataGridPoker p = new DataGridPoker ();
1947 			TemplateColumn tc = new TemplateColumn ();
1948 			tc.ItemTemplate = new MyTemplate ("hola");
1949 			p.Columns.Add (tc);
1950 			p.DataSource = new ArrayList ();
1951 			p.CreateControls (false);
1952 			Assert.AreEqual (1, p.Columns.Count, "columns");
1953 			// Table added because useDataSource == false...
1954 			Assert.AreEqual (1, p.Controls.Count, "controls");
1955 			string render = p.Render ();
1956 			// ... but no template rendered.
1957 			Assert.IsTrue (-1 == render.IndexOf ("hola"), "template");
1958 		}
1959 		*/
1960 
1961 		[Test]
CreateControls()1962 		public void CreateControls ()
1963 		{
1964 			DataGridPoker p = new DataGridPoker ();
1965 			DataTable table = new DataTable ();
1966 
1967 			table.Columns.Add (new DataColumn ("one", typeof (string)));
1968 			table.Columns.Add (new DataColumn ("two", typeof (string)));
1969 			table.Columns.Add (new DataColumn ("three", typeof (string)));
1970 			table.Rows.Add (new object [] { "1", "2", "3" });
1971 
1972 			p.DataSource = new DataView (table);
1973 
1974 			p.CreateControls (true);
1975 			Assert.AreEqual (p.Controls.Count, 1, "A1");
1976 
1977 			ShowControlsRecursive (p.Controls [0], 1);
1978 		}
1979 
1980 		[Test]
CreationEvents()1981 		public void CreationEvents ()
1982 		{
1983 			DataGridPoker p = new DataGridPoker ();
1984 			DataTable table = new DataTable ();
1985 
1986 			table.Columns.Add (new DataColumn ("one", typeof (string)));
1987 			table.Columns.Add (new DataColumn ("two", typeof (string)));
1988 			table.Columns.Add (new DataColumn ("three", typeof (string)));
1989 
1990 			p.DataSource = new DataView (table);
1991 
1992 			p.ItemCreated += new DataGridItemEventHandler (ItemCreatedHandler);
1993 			p.ItemDataBound += new DataGridItemEventHandler (ItemDataBoundHandler);
1994 
1995 			// No items added yet
1996 			ResetEvents ();
1997 			p.CreateControls (true);
1998 			Assert.IsTrue (item_created, "A1");
1999 			Assert.IsTrue (item_data_bound, "A2");
2000 
2001 			table.Rows.Add (new object [] { "1", "2", "3" });
2002 
2003 			ResetEvents ();
2004 			p.CreateControls (true);
2005 			Assert.IsTrue (item_created, "A3");
2006 			Assert.IsTrue (item_data_bound, "A4");
2007 
2008 			// no databinding
2009 			ResetEvents ();
2010 			p.CreateControls (false);
2011 			Assert.IsTrue (item_created, "A5");
2012 			Assert.IsFalse (item_data_bound, "A6");
2013 		}
2014 
2015 		[Test]
InitializePager()2016 		public void InitializePager ()
2017 		{
2018 			DataGridPoker p = new DataGridPoker ();
2019 			PagedDataSource paged = new PagedDataSource ();
2020 			DataTable table = new DataTable ();
2021 			DataGridItem item = new DataGridItem (-1, -1, ListItemType.Pager);
2022 			ArrayList columns;
2023 			LinkButton next;
2024 			LinkButton prev;
2025 
2026 			table.Columns.Add (new DataColumn ("one", typeof (string)));
2027 			table.Columns.Add (new DataColumn ("two", typeof (string)));
2028 			table.Columns.Add (new DataColumn ("three", typeof (string)));
2029 
2030 			for (int i = 0; i < 25; i++)
2031 				table.Rows.Add (new object [] { "1", "2", "3" });
2032 			paged.DataSource = new DataView (table);
2033 
2034 			columns = p.CreateColumns (paged, true);
2035 			p.InitPager (item, columns.Count, paged);
2036 
2037 			//
2038 			// No where to go
2039 			//
2040 
2041 			Assert.AreEqual (item.Controls.Count, 1, "A1");
2042 			Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A2");
2043 			Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A3");
2044 			Assert.AreEqual (item.Controls [0].Controls [0].GetType (), typeof (Label), "A4");
2045 			Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2046 					typeof (LiteralControl), "A5");
2047 			Assert.AreEqual (item.Controls [0].Controls [2].GetType (), typeof (Label), "A6");
2048 			Assert.AreEqual (((Label) item.Controls [0].Controls [0]).Text, "&lt;", "A7");
2049 			Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2050 					"&nbsp;", "A7");
2051 			Assert.AreEqual (((Label) item.Controls [0].Controls [2]).Text, "&gt;", "A8");
2052 
2053 			//
2054 			// Next
2055 			//
2056 
2057 			item = new DataGridItem (-1, -1, ListItemType.Pager);
2058 			paged.PageSize = 5;
2059 			paged.VirtualCount = 25;
2060 			paged.AllowPaging = true;
2061 			p.InitPager (item, columns.Count, paged);
2062 
2063 			Assert.AreEqual (item.Controls.Count, 1, "A9");
2064 			Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A10");
2065 			Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A11");
2066 			Assert.AreEqual (item.Controls [0].Controls [0].GetType (), typeof (Label), "A12");
2067 			Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2068 					typeof (LiteralControl), "A13");
2069 			Assert.AreEqual (((Label) item.Controls [0].Controls [0]).Text, "&lt;", "A14");
2070 			Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2071 					"&nbsp;", "A16");
2072 
2073 			next = (LinkButton) item.Controls [0].Controls [2];
2074 			Assert.AreEqual (next.Text, "&gt;", "A17");
2075 			Assert.AreEqual (next.CommandName, "Page", "A18");
2076 			Assert.AreEqual (next.CommandArgument, "Next", "A19");
2077 
2078 
2079 			//
2080 			// Both
2081 			//
2082 
2083 			item = new DataGridItem (-1, -1, ListItemType.Pager);
2084 			paged.PageSize = 5;
2085 			paged.VirtualCount = 25;
2086 			paged.AllowPaging = true;
2087 			paged.CurrentPageIndex = 2;
2088 			p.InitPager (item, columns.Count, paged);
2089 
2090 			Assert.AreEqual (item.Controls.Count, 1, "A20");
2091 			Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A21");
2092 			Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A22");
2093 			Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2094 					typeof (LiteralControl), "A23");
2095 			Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2096 					"&nbsp;", "A24");
2097 
2098 			// This is failing with an invalidcast right now. It's something related to
2099 			// the pager thinking that it's on the last page and rendering a label instead
2100 			next = (LinkButton) item.Controls [0].Controls [2];
2101 			Assert.AreEqual (next.Text, "&gt;", "A25");
2102 			Assert.AreEqual (next.CommandName, "Page", "A26");
2103 			Assert.AreEqual (next.CommandArgument, "Next", "A27");
2104 
2105 			prev = (LinkButton) item.Controls [0].Controls [0];
2106 			Assert.AreEqual (prev.Text, "&lt;", "A28");
2107 			Assert.AreEqual (prev.CommandName, "Page", "A29");
2108 			Assert.AreEqual (prev.CommandArgument, "Prev", "A30");
2109 
2110 			//
2111 			// Back only
2112 			//
2113 
2114 			item = new DataGridItem (-1, -1, ListItemType.Pager);
2115 			paged.PageSize = 5;
2116 			paged.VirtualCount = 25;
2117 			paged.AllowPaging = true;
2118 			paged.CurrentPageIndex = 4;
2119 			p.InitPager (item, columns.Count, paged);
2120 
2121 			Assert.AreEqual (item.Controls.Count, 1, "A31");
2122 			Assert.AreEqual (item.Controls [0].GetType (), typeof (TableCell), "A32");
2123 			Assert.AreEqual (item.Controls [0].Controls.Count, 3, "A33");
2124 			Assert.AreEqual (item.Controls [0].Controls [1].GetType (),
2125 					typeof (LiteralControl), "A34");
2126 			Assert.AreEqual (item.Controls [0].Controls [2].GetType (), typeof (Label), "A35");
2127 			Assert.AreEqual (((LiteralControl) item.Controls [0].Controls [1]).Text,
2128 					"&nbsp;", "A36");
2129 			Assert.AreEqual (((Label) item.Controls [0].Controls [2]).Text, "&gt;", "A37");
2130 
2131 			prev = (LinkButton) item.Controls [0].Controls [0];
2132 			Assert.AreEqual (prev.Text, "&lt;", "A38");
2133 			Assert.AreEqual (prev.CommandName, "Page", "A39");
2134 			Assert.AreEqual (prev.CommandArgument, "Prev", "A40");
2135 
2136 		}
2137 
2138 		[Conditional ("VERBOSE_DATAGRID")]
ShowControlsRecursive(Control c, int depth)2139 		private void ShowControlsRecursive (Control c, int depth)
2140 		{
2141 			for (int i = 0; i < depth; i++)
2142 				Console.Write ("-");
2143 
2144 			// StringWriter sw = new StringWriter ();
2145 			// HtmlTextWriter tw = new HtmlTextWriter (sw);
2146 
2147 			// c.RenderControl (tw);
2148 			// Console.WriteLine (sw.ToString ());
2149 
2150 			Console.WriteLine (c);
2151 
2152 			foreach (Control child in c.Controls)
2153 				ShowControlsRecursive (child, depth + 5);
2154 		}
2155 
2156 		[Test]
Render()2157 		public void Render ()
2158 		{
2159 			DataGridPoker p = new DataGridPoker ();
2160 
2161 			Assert.AreEqual (p.Render (), String.Empty, "A1");
2162 		}
2163 
FindByType(Control parent, Type type)2164 		Control FindByType (Control parent, Type type)
2165 		{
2166 			if (!parent.HasControls ())
2167 				return null;
2168 
2169 			foreach (Control c in parent.Controls) {
2170 				if (type.IsAssignableFrom (c.GetType ()))
2171 					return c;
2172 
2173 				Control ret = FindByType (c, type);
2174 				if (ret != null)
2175 					return ret;
2176 			}
2177 			return null;
2178 		}
2179 
2180 		// Header link
2181 		[Test]
SpecialLinkButton1()2182 		public void SpecialLinkButton1 ()
2183 		{
2184 			DataTable dt = new DataTable();
2185 			dt.Columns.Add (new DataColumn("something", typeof(Int32)));
2186 			DataRow dr = dt.NewRow ();
2187 			dt.Rows.Add (new object [] { 1 });
2188 			DataView dv = new DataView (dt);
2189 			DataGridPoker dg = new DataGridPoker ();
2190 			dg.AllowSorting = true;
2191 			dg.HeaderStyle.Font.Bold = true;
2192 			dg.HeaderStyle.ForeColor = Color.FromArgb (255,255,255,255);
2193 			dg.HeaderStyle.BackColor = Color.FromArgb (33,33,33,33);
2194 			dg.DataSource = dv;
2195 			dg.DataBind ();
2196 			LinkButton lb = (LinkButton) FindByType (dg.Controls [0], typeof (LinkButton));
2197 			Assert.IsNotNull (lb, "lb");
2198 			StringWriter sr = new StringWriter ();
2199 			HtmlTextWriter output = new HtmlTextWriter (sr);
2200 			// Nothing here...
2201 			Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore");
2202 			lb.RenderControl (output);
2203 			// Nothing here...
2204 			Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore2");
2205 			dg.Render ();
2206 			// Surprise! after rendering the datagrid, the linkbutton has the ForeColor from the datagrid
2207 			Assert.AreEqual (Color.FromArgb (255,255,255,255), lb.ControlStyle.ForeColor, "fore3");
2208 
2209 			// Extra. Items != empty
2210 			Assert.AreEqual (1, dg.Items.Count, "itemCount");
2211 		}
2212 
2213 		// value link in buttoncolumn
2214 		[Test]
SpecialLinkButton2()2215 		public void SpecialLinkButton2 ()
2216 		{
2217 			DataTable dt = new DataTable();
2218 			dt.Columns.Add (new DataColumn("string_col", typeof(string)));
2219 			DataRow dr = dt.NewRow ();
2220 			dt.Rows.Add (new object [] { "Item 1" });
2221 			DataView dv = new DataView (dt);
2222 
2223 			DataGridPoker dg = new DataGridPoker ();
2224 			dg.DataSource = dv;
2225 			dg.AutoGenerateColumns = false;
2226 			dg.HeaderStyle.ForeColor = Color.FromArgb (255,255,255,255);
2227 			dg.HeaderStyle.BackColor = Color.FromArgb (33,33,33,33);
2228 
2229 			ButtonColumn bc = new ButtonColumn ();
2230 			bc.HeaderText = "Some header";
2231 			bc.DataTextField = "string_col";
2232 			bc.CommandName = "lalala";
2233 			dg.Columns.Add (bc);
2234 
2235 			BoundColumn bound = new BoundColumn ();
2236 			bound.HeaderText = "The other column";
2237 			bound.DataField = "string_col";
2238 			dg.Columns.Add (bound);
2239 
2240 			dg.DataBind ();
2241 
2242 			LinkButton lb = (LinkButton) FindByType (dg.Controls [0], typeof (LinkButton));
2243 			Assert.IsNotNull (lb, "lb");
2244 			StringWriter sr = new StringWriter ();
2245 			HtmlTextWriter output = new HtmlTextWriter (sr);
2246 			Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore");
2247 			lb.RenderControl (output);
2248 			Assert.AreEqual (Color.Empty, lb.ControlStyle.ForeColor, "fore2");
2249 			string str = dg.Render ();
2250 			Assert.IsTrue (-1 != str.IndexOf ("<a>Item 1</a>"), "item1");
2251 			Assert.IsTrue (-1 != str.IndexOf ("<td>Item 1</td>"), "item1-2");
2252 		}
2253 	}
2254 }
2255 
2256