1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2008 Novell, Inc. (http://www.novell.com)
23 // Jonathan Pobst (monkey@jpobst.com)
28 using NUnit.Framework;
31 using System.Windows.Forms;
32 using System.ComponentModel;
33 using System.Collections;
35 using System.Collections.Generic;
37 namespace MonoTests.System.Windows.Forms.DataGridViewBindingTest
41 public class DataSetBindingTest : TestHelper
44 public void TestDataSet ()
46 // Binding to a DataSet doesn't work unless you specify DataMember
48 f.ShowInTaskbar = false;
50 DataSet ds = new DataSet ();
52 DataTable dt = ds.Tables.Add ("Muppets");
54 dt.Columns.Add ("ID");
55 dt.Columns.Add ("Name");
56 dt.Columns.Add ("Sex");
58 dt.Rows.Add (1, "Kermit", "Male");
59 dt.Rows.Add (2, "Miss Piggy", "Female");
60 dt.Rows.Add (3, "Gonzo", "Male");
62 DataGridView dgv = new DataGridView ();
68 Assert.AreEqual (0, dgv.Columns.Count, "A1");
69 Assert.AreEqual (0, dgv.Rows.Count, "A2");
71 dgv.DataMember = "Muppets";
73 Assert.AreEqual (3, dgv.Columns.Count, "A3");
74 Assert.AreEqual (4, dgv.Rows.Count, "A4");
80 public void TestBasic ()
82 // Binding to a basic DataTable
84 f.ShowInTaskbar = false;
86 DataSet ds = new DataSet ();
88 DataTable dt = ds.Tables.Add ("Muppets");
90 dt.Columns.Add ("ID");
91 dt.Columns.Add ("Name");
92 dt.Columns.Add ("Sex");
94 dt.Rows.Add (1, "Kermit", "Male");
95 dt.Rows.Add (2, "Miss Piggy", "Female");
96 dt.Rows.Add (3, "Gonzo", "Male");
98 DataGridView dgv = new DataGridView ();
101 f.Controls.Add (dgv);
104 Assert.AreEqual (3, dgv.ColumnCount, "A1");
105 Assert.AreEqual (4, dgv.RowCount, "A2");
107 Assert.AreEqual ("ID", dgv.Columns[0].Name, "A3");
108 Assert.AreEqual ("ID", dgv.Columns[0].DataPropertyName, "A4");
109 Assert.AreEqual (0, dgv.Columns[0].DisplayIndex, "A5");
110 Assert.AreEqual ("ID", dgv.Columns[0].HeaderText, "A6");
111 Assert.AreEqual (0, dgv.Columns[0].Index, "A7");
112 Assert.AreEqual (true, dgv.Columns[0].IsDataBound, "A8");
113 Assert.AreEqual (false, dgv.Columns[0].ReadOnly, "A9");
114 Assert.AreEqual (true, dgv.Columns[0].Visible, "A10");
115 Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxCell", dgv.Columns[0].CellType.ToString (), "A11");
116 Assert.AreEqual ("System.String", dgv.Columns[0].ValueType.ToString (), "A11-B");
117 Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxColumn", dgv.Columns[0].GetType ().ToString (), "A11-C");
119 Assert.AreEqual ("Name", dgv.Columns[1].Name, "A12");
120 Assert.AreEqual ("Name", dgv.Columns[1].DataPropertyName, "A13");
121 Assert.AreEqual (1, dgv.Columns[1].DisplayIndex, "A14");
122 Assert.AreEqual ("Name", dgv.Columns[1].HeaderText, "A15");
123 Assert.AreEqual (1, dgv.Columns[1].Index, "A16");
124 Assert.AreEqual (true, dgv.Columns[1].IsDataBound, "A17");
125 Assert.AreEqual (false, dgv.Columns[1].ReadOnly, "A18");
126 Assert.AreEqual (true, dgv.Columns[1].Visible, "A19");
127 Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxCell", dgv.Columns[1].CellType.ToString (), "A20");
128 Assert.AreEqual ("System.String", dgv.Columns[1].ValueType.ToString (), "A20-B");
130 Assert.AreEqual ("Sex", dgv.Columns[2].Name, "A21");
131 Assert.AreEqual ("Sex", dgv.Columns[2].DataPropertyName, "A22");
132 Assert.AreEqual (2, dgv.Columns[2].DisplayIndex, "A23");
133 Assert.AreEqual ("Sex", dgv.Columns[2].HeaderText, "A24");
134 Assert.AreEqual (2, dgv.Columns[2].Index, "A25");
135 Assert.AreEqual (true, dgv.Columns[2].IsDataBound, "A26");
136 Assert.AreEqual (false, dgv.Columns[2].ReadOnly, "A27");
137 Assert.AreEqual (true, dgv.Columns[2].Visible, "A28");
138 Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxCell", dgv.Columns[2].CellType.ToString (), "A29");
139 Assert.AreEqual ("System.String", dgv.Columns[2].ValueType.ToString (), "A29-B");
141 Assert.AreEqual ("1", dgv.Rows[0].Cells[0].Value, "A30");
142 Assert.AreEqual ("Kermit", dgv.Rows[0].Cells[1].Value, "A31");
143 Assert.AreEqual ("Male", dgv.Rows[0].Cells[2].Value, "A32");
144 Assert.AreEqual ("2", dgv.Rows[1].Cells[0].Value, "A33");
145 Assert.AreEqual ("Miss Piggy", dgv.Rows[1].Cells[1].Value, "A34");
146 Assert.AreEqual ("Female", dgv.Rows[1].Cells[2].Value, "A35");
147 Assert.AreEqual ("3", dgv.Rows[2].Cells[0].Value, "A36");
148 Assert.AreEqual ("Gonzo", dgv.Rows[2].Cells[1].Value, "A37");
149 Assert.AreEqual ("Male", dgv.Rows[2].Cells[2].Value, "A38");
155 public void TestCheckBoxColumn ()
157 // Binding to a basic DataTable with a boolean value
158 Form f = new Form ();
159 f.ShowInTaskbar = false;
161 DataSet ds = new DataSet ();
163 DataTable dt = ds.Tables.Add ("Muppets");
165 dt.Columns.Add ("ID");
166 dt.Columns.Add ("Name");
167 dt.Columns.Add ("IsFunny", typeof (bool));
169 dt.Rows.Add (1, "Kermit", "true");
170 dt.Rows.Add (2, "Miss Piggy", "false");
171 dt.Rows.Add (3, "Gonzo", DBNull.Value);
172 dt.Rows.Add (4, "Animal", true);
173 dt.Rows.Add (5, "Fozzy", false);
174 dt.Rows.Add (6, "Beaker", "TRUE");
175 dt.Rows.Add (7, "Bunsen", "fALSe");
176 dt.Rows.Add (8, "Sweedish Chef", 1);
177 dt.Rows.Add (9, "Rolf", 0);
179 DataGridView dgv = new DataGridView ();
182 f.Controls.Add (dgv);
185 Assert.AreEqual (3, dgv.ColumnCount, "A1");
186 Assert.AreEqual (10, dgv.RowCount, "A2");
188 Assert.AreEqual ("IsFunny", dgv.Columns[2].Name, "A3");
189 Assert.AreEqual ("IsFunny", dgv.Columns[2].DataPropertyName, "A4");
190 Assert.AreEqual (2, dgv.Columns[2].DisplayIndex, "A5");
191 Assert.AreEqual ("IsFunny", dgv.Columns[2].HeaderText, "A6");
192 Assert.AreEqual (2, dgv.Columns[2].Index, "A7");
193 Assert.AreEqual (true, dgv.Columns[2].IsDataBound, "A8");
194 Assert.AreEqual (false, dgv.Columns[2].ReadOnly, "A9");
195 Assert.AreEqual (true, dgv.Columns[2].Visible, "A10");
196 Assert.AreEqual ("System.Windows.Forms.DataGridViewCheckBoxCell", dgv.Columns[2].CellType.ToString (), "A11");
197 Assert.AreEqual ("System.Boolean", dgv.Columns[2].ValueType.ToString (), "A12");
198 Assert.AreEqual ("System.Windows.Forms.DataGridViewCheckBoxColumn", dgv.Columns[2].GetType ().ToString (), "A12-B");
200 Assert.AreEqual (true, dgv.Rows[0].Cells[2].Value, "A13");
201 Assert.AreEqual (false, dgv.Rows[1].Cells[2].Value, "A14");
202 Assert.AreEqual (DBNull.Value, dgv.Rows[2].Cells[2].Value, "A15");
203 Assert.AreEqual (true, dgv.Rows[3].Cells[2].Value, "A16");
204 Assert.AreEqual (false, dgv.Rows[4].Cells[2].Value, "A17");
205 Assert.AreEqual (true, dgv.Rows[5].Cells[2].Value, "A18");
206 Assert.AreEqual (false, dgv.Rows[6].Cells[2].Value, "A19");
207 Assert.AreEqual (true, dgv.Rows[7].Cells[2].Value, "A20");
208 Assert.AreEqual (false, dgv.Rows[8].Cells[2].Value, "A21");
210 Assert.AreEqual ("System.Windows.Forms.DataGridViewCheckBoxCell", dgv.Rows[8].Cells[2].GetType ().ToString (), "A22");
216 public void TestAutoGenerateColumns ()
218 // Binding when AutoGenerateColumns is false
219 Form f = new Form ();
220 f.ShowInTaskbar = false;
222 DataSet ds = new DataSet ();
224 DataTable dt = ds.Tables.Add ("Muppets");
226 dt.Columns.Add ("ID");
227 dt.Columns.Add ("Name");
229 dt.Rows.Add (1, "Kermit");
230 dt.Rows.Add (2, "Miss Piggy");
231 dt.Rows.Add (3, "Gonzo");
233 DataGridView dgv = new DataGridView ();
234 dgv.AutoGenerateColumns = false;
237 f.Controls.Add (dgv);
240 Assert.AreEqual (0, dgv.ColumnCount, "A1");
241 Assert.AreEqual (0, dgv.RowCount, "A2");
243 dgv.DataSource = null;
245 DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
246 col1.DataPropertyName = "Name";
247 dgv.Columns.Add (col1);
251 Assert.AreEqual (1, dgv.ColumnCount, "A3");
252 Assert.AreEqual (4, dgv.RowCount, "A4");
254 Assert.AreEqual ("Kermit", dgv.Rows[0].Cells[0].Value, "A5");
256 dgv.DataSource = null;
258 DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn ();
259 col2.DataPropertyName = "id";
260 dgv.Columns.Add (col2);
264 Assert.AreEqual (2, dgv.ColumnCount, "A6");
265 Assert.AreEqual (4, dgv.RowCount, "A7");
267 Assert.AreEqual ("Kermit", dgv.Rows[0].Cells[0].Value, "A8");
268 Assert.AreEqual ("1", dgv.Rows[0].Cells[1].Value, "A9");
273 [Test] // Bug #399601
274 public void TestAddingWithoutAutoGenerate ()
276 // Binding when AutoGenerateColumns is false
277 // and adding rows to the dataset
278 Form f = new Form ();
279 f.ShowInTaskbar = false;
281 DataSet ds = new DataSet ();
283 DataTable dt = ds.Tables.Add ("Muppets");
285 dt.Columns.Add ("ID");
286 dt.Columns.Add ("Name");
288 DataGridView dgv = new DataGridView ();
289 dgv.AutoGenerateColumns = false;
290 dgv.AllowUserToAddRows = false;
292 DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
293 col1.DataPropertyName = "Name";
294 dgv.Columns.Add (col1);
298 f.Controls.Add (dgv);
301 dt.Rows.Add (1, "Kermit");
302 dt.Rows.Add (2, "Miss Piggy");
303 dt.Rows.Add (3, "Gonzo");
305 Assert.AreEqual (1, dgv.ColumnCount, "A1");
306 Assert.AreEqual (3, dgv.RowCount, "A2");
312 public void TestDeleting ()
314 // Binding when AutoGenerateColumns is false
315 // and deleting rows from the dataset and DGV
316 Form f = new Form ();
317 f.ShowInTaskbar = false;
319 DataSet ds = new DataSet ();
321 DataTable dt = ds.Tables.Add ("Muppets");
323 dt.Columns.Add ("ID");
324 dt.Columns.Add ("Name");
326 DataGridView dgv = new DataGridView ();
327 dgv.AutoGenerateColumns = false;
328 dgv.AllowUserToAddRows = false;
330 DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
331 col1.DataPropertyName = "Name";
332 dgv.Columns.Add (col1);
336 f.Controls.Add (dgv);
339 dt.Rows.Add (1, "Kermit");
340 dt.Rows.Add (2, "Miss Piggy");
341 dt.Rows.Add (3, "Gonzo");
343 Assert.AreEqual (1, dgv.ColumnCount, "A1");
344 Assert.AreEqual (3, dgv.RowCount, "A2");
346 dt.Rows[2].Delete ();
347 Assert.AreEqual (2, dgv.RowCount, "A3");
349 dgv.Rows.RemoveAt (0);
350 Assert.AreEqual (1, dgv.RowCount, "A4");
356 public void TestChangingDataSetAfterSettingDataSource ()
358 // Binding when AutoGenerateColumns is false
359 // and deleting rows from the dataset and DGV
360 Form f = new Form ();
361 f.ShowInTaskbar = false;
363 DataSet ds = new DataSet ();
365 DataGridView dgv = new DataGridView ();
366 dgv.AutoGenerateColumns = false;
367 dgv.AllowUserToAddRows = false;
369 DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
370 col1.DataPropertyName = "Name";
371 dgv.Columns.Add (col1);
374 dgv.DataMember = "Muppets";
376 DataTable dt = ds.Tables.Add ("Muppets");
378 dt.Columns.Add ("ID");
379 dt.Columns.Add ("Name");
381 f.Controls.Add (dgv);
384 dt.Rows.Add (1, "Kermit");
385 dt.Rows.Add (2, "Miss Piggy");
386 dt.Rows.Add (3, "Gonzo");
388 Assert.AreEqual (1, dgv.ColumnCount, "A1");
389 Assert.AreEqual (3, dgv.RowCount, "A2");
391 dt.Rows[2].Delete ();
392 Assert.AreEqual (2, dgv.RowCount, "A3");
394 dgv.Rows.RemoveAt (0);
395 Assert.AreEqual (1, dgv.RowCount, "A4");
400 [Test] // bug #448005
401 public void TestClearing ()
403 // Binding to a DataSet doesn't work unless you specify DataMember
404 Form f = new Form ();
405 f.ShowInTaskbar = false;
407 DataSet ds = new DataSet ();
409 DataTable dt = ds.Tables.Add ("Muppets");
411 dt.Columns.Add ("ID");
412 dt.Columns.Add ("Name");
413 dt.Columns.Add ("Sex");
415 dt.Rows.Add (1, "Kermit", "Male");
416 dt.Rows.Add (2, "Miss Piggy", "Female");
417 dt.Rows.Add (3, "Gonzo", "Male");
419 DataGridView dgv = new DataGridView ();
422 f.Controls.Add (dgv);
425 dgv.DataMember = "Muppets";
427 Assert.AreEqual (3, dgv.Columns.Count, "A1");
428 Assert.AreEqual (4, dgv.Rows.Count, "A2");
430 ds.Tables[0].Clear ();
432 Assert.AreEqual (3, dgv.Columns.Count, "A3");
433 Assert.AreEqual (1, dgv.Rows.Count, "A4");
438 [Test] // bug #462019
439 public void TestCreatingColumnsAfterBind ()
441 // When columns are added, we need to rebind.
442 Form f = new Form ();
443 f.ShowInTaskbar = false;
445 DataSet ds = new DataSet ();
447 DataTable dt = ds.Tables.Add ("Muppets");
449 dt.Columns.Add ("ID");
450 dt.Columns.Add ("Name");
451 dt.Columns.Add ("Sex");
453 dt.Rows.Add (1, "Kermit", "Male");
454 dt.Rows.Add (2, "Miss Piggy", "Female");
455 dt.Rows.Add (3, "Gonzo", "Male");
457 DataGridView dgv = new DataGridView ();
458 dgv.AutoGenerateColumns = false;
459 dgv.AllowUserToAddRows = false;
461 dgv.DataMember = "Muppets";
463 f.Controls.Add (dgv);
466 Assert.AreEqual (0, dgv.Rows.Count, "A1");
468 DataGridViewColumn col = new DataGridViewTextBoxColumn ();
469 col.DataPropertyName = "ID";
470 dgv.Columns.Add (col);
472 Assert.AreEqual (3, dgv.Rows.Count, "A1");
479 public class BindingListTest : TestHelper
481 [Test] // bug #325239
482 public void TestNullItemInList ()
484 Form f = new Form ();
485 f.ShowInTaskbar = false;
487 // The list contains one object, but the object is null
488 IList<Customer> list = new Customer[1];
490 DataGridView dgv = new DataGridView ();
491 dgv.DataSource = new BindingList<Customer> (list);
493 f.Controls.Add (dgv);
496 Assert.AreEqual (1, dgv.ColumnCount, "A1");
497 Assert.AreEqual (2, dgv.RowCount, "A2");
502 private class Customer
508 set { name = value; }
514 public class ArrayTest : TestHelper
516 [Test] // bug #337470
517 public void TestNestedCollections ()
519 // The grid should not accept collection properties, like Names
520 Form f = new Form ();
521 f.ShowInTaskbar = false;
523 Array customers = new Customer[1];
524 customers.SetValue (new Customer (), 0);
526 DataGridView dgv = new DataGridView ();
527 dgv.DataSource = customers;
529 f.Controls.Add (dgv);
532 Assert.AreEqual (1, dgv.ColumnCount, "A1");
533 Assert.AreEqual ("Name", dgv.Columns[0].Name, "A2");
538 private class Customer
540 public string Name { get { return "Kermit"; } }
541 public string[] Names { get { return new string[] { "Kermit", "Gonzo" }; } }
546 public class BindingSourceTest : TestHelper
548 [Test] // bug #345483
549 public void TestBindingSource ()
551 // The grid has to extract the List from the BindingSource
552 Form f = new Form ();
553 f.ShowInTaskbar = false;
555 BindingSource BindingSource = new BindingSource ();
557 DataSet dataSet1 = new DataSet ();
559 dataSet1.Tables.Add ();
560 dataSet1.Tables[0].Columns.Add ();
561 dataSet1.Tables[0].Columns.Add ();
562 dataSet1.Tables[0].Columns.Add ();
563 dataSet1.Tables[0].Columns.Add ();
564 dataSet1.Tables[0].Columns.Add ();
565 dataSet1.Tables[0].Rows.Add ("111111", "222222", "333333", "444444", "555555");
567 BindingSource.DataSource = dataSet1.Tables[0];
569 DataGridView dgv = new DataGridView ();
570 dgv.DataSource = BindingSource;
572 f.Controls.Add (dgv);
575 Assert.AreEqual (5, dgv.ColumnCount, "A1");
576 Assert.AreEqual (2, dgv.RowCount, "A2");
578 Assert.AreEqual ("Column1", dgv.Columns[0].Name, "A3");
579 Assert.AreEqual ("111111", dgv.Rows[0].Cells[0].Value, "A4");
584 private class Customer
586 public string Name { get { return "Kermit"; } }
587 public string[] Names { get { return new string[] { "Kermit", "Gonzo" }; } }