Procházet zdrojové kódy

2008-11-24 Jonathan Pobst <[email protected]>

	* DataGridView.cs: Listen for a DataTable's TableCleared event so we
	can clear ourselves when it is raised, we don't have a newrowindex
	if we don't have any columns.
	* DataGridViewRowCollection.cs: Ensure we always delete all the rows,
	re-index after each delete so the NewRow will have the correct index.
	[Fixes bug #448005]

2008-11-24  Jonathan Pobst  <[email protected]>

	* DataGridViewDataBindingTest.cs: Flush and add test for bug #448005.
	* DataGridViewRowCollectionTest.cs: Add test for bug #448005.

svn path=/trunk/mcs/; revision=119826
Jonathan Pobst před 17 roky
rodič
revize
fe22878032

+ 9 - 0
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog

@@ -1,3 +1,12 @@
+2008-11-24  Jonathan Pobst  <[email protected]>
+
+	* DataGridView.cs: Listen for a DataTable's TableCleared event so we
+	can clear ourselves when it is raised, we don't have a newrowindex
+	if we don't have any columns.
+	* DataGridViewRowCollection.cs: Ensure we always delete all the rows,
+	re-index after each delete so the NewRow will have the correct index.
+	[Fixes bug #448005]
+
 2008-11-24  Jonathan Pobst  <[email protected]>
 
 	* Form.cs: Don't change min/max size if it is empty.

+ 8 - 1
mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs

@@ -933,7 +933,7 @@ namespace System.Windows.Forms {
 		[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
 		public int NewRowIndex {
 			get {
-				if (!allowUserToAddRows) {
+				if (!allowUserToAddRows || ColumnCount == 0) {
 					return -1;
 				}
 				return rows.Count - 1;
@@ -5731,6 +5731,7 @@ namespace System.Windows.Forms {
 			if (list is DataView) {
 				(list as DataView).ListChanged += OnListChanged;
 				(list as DataView).Table.ColumnChanged += OnTableColumnChanged;
+				(list as DataView).Table.TableCleared += OnTableCleared;
 			}
 			
 			// Add the rows
@@ -6006,6 +6007,12 @@ namespace System.Windows.Forms {
 			DoBinding ();
 		}
 
+		private void OnTableCleared (object sender, DataTableClearEventArgs e)
+		{
+			ClearBinding ();
+			DoBinding ();
+		}
+
 		private bool MouseOverColumnResize (int col, int mousex)
 		{
 			if (!allowUserToResizeColumns)

+ 4 - 1
mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs

@@ -240,7 +240,9 @@ namespace System.Windows.Forms
 
 		public virtual void Clear ()
 		{
-			for (int i = 0; i < list.Count; i++) {
+			int total = list.Count;
+			
+			for (int i = 0; i < total; i++) {
 				DataGridViewRow row = (DataGridViewRow)list[0];
 				
 				// We can exit because the NewRow is always last
@@ -248,6 +250,7 @@ namespace System.Windows.Forms
 					break;
 					
 				list.Remove (row);
+				ReIndex ();
 			}
 		}
 

+ 5 - 0
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog

@@ -1,3 +1,8 @@
+2008-11-24  Jonathan Pobst  <[email protected]>
+
+	* DataGridViewDataBindingTest.cs: Flush and add test for bug #448005.
+	* DataGridViewRowCollectionTest.cs: Add test for bug #448005.
+
 2008-11-23  Jonathan Pobst  <[email protected]>
 
 	* FormTest.cs: Add test for bug #447873.

+ 84 - 0
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewDataBindingTest.cs

@@ -351,6 +351,90 @@ namespace MonoTests.System.Windows.Forms.DataGridViewBindingTest
 			
 			f.Dispose();
 		}
+
+		[Test]
+		public void TestChangingDataSetAfterSettingDataSource ()
+		{
+			// Binding when AutoGenerateColumns is false
+			// and deleting rows from the dataset and DGV
+			Form f = new Form ();
+			f.ShowInTaskbar = false;
+
+			DataSet ds = new DataSet ();
+
+			DataGridView dgv = new DataGridView ();
+			dgv.AutoGenerateColumns = false;
+			dgv.AllowUserToAddRows = false;
+
+			DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
+			col1.DataPropertyName = "Name";
+			dgv.Columns.Add (col1);
+
+			dgv.DataSource = ds;
+			dgv.DataMember = "Muppets";
+
+			DataTable dt = ds.Tables.Add ("Muppets");
+
+			dt.Columns.Add ("ID");
+			dt.Columns.Add ("Name");
+
+			f.Controls.Add (dgv);
+			f.Show ();
+
+			dt.Rows.Add (1, "Kermit");
+			dt.Rows.Add (2, "Miss Piggy");
+			dt.Rows.Add (3, "Gonzo");
+
+			Assert.AreEqual (1, dgv.ColumnCount, "A1");
+			Assert.AreEqual (3, dgv.RowCount, "A2");
+
+			dt.Rows[2].Delete ();
+			Assert.AreEqual (2, dgv.RowCount, "A3");
+
+			dgv.Rows.RemoveAt (0);
+			Assert.AreEqual (1, dgv.RowCount, "A4");
+
+			f.Dispose ();
+		}
+
+		[Test]  // bug #448005
+		public void TestClearing ()
+		{
+			// Binding to a DataSet doesn't work unless you specify DataMember
+			Form f = new Form ();
+			f.ShowInTaskbar = false;
+
+			DataSet ds = new DataSet ();
+
+			DataTable dt = ds.Tables.Add ("Muppets");
+
+			dt.Columns.Add ("ID");
+			dt.Columns.Add ("Name");
+			dt.Columns.Add ("Sex");
+
+			dt.Rows.Add (1, "Kermit", "Male");
+			dt.Rows.Add (2, "Miss Piggy", "Female");
+			dt.Rows.Add (3, "Gonzo", "Male");
+
+			DataGridView dgv = new DataGridView ();
+			dgv.DataSource = ds;
+
+			f.Controls.Add (dgv);
+			f.Show ();
+
+			dgv.DataMember = "Muppets";
+
+			Assert.AreEqual (3, dgv.Columns.Count, "A1");
+			Assert.AreEqual (4, dgv.Rows.Count, "A2");
+			
+			ds.Tables[0].Clear ();
+			
+			Assert.AreEqual (3, dgv.Columns.Count, "A3");
+			Assert.AreEqual (1, dgv.Rows.Count, "A4");
+
+			f.Dispose ();
+		}
+
 	}
 	
 	[TestFixture]

+ 18 - 0
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewRowCollectionTest.cs

@@ -131,6 +131,24 @@ namespace MonoTests.System.Windows.Forms
 			// This was crashing in the bug
 			dgv.Sort (dgv.Columns[0], ListSortDirection.Ascending);
 		}
+		
+		[Test]  // bug #448005
+		public void ClearRows ()
+		{
+			DataGridView dgv = new DataGridView ();
+			dgv.Columns.Add ("A", "A");
+			dgv.Columns.Add ("A2", "A2");
+
+			dgv.Rows.Add (1, 2);
+			dgv.Rows.Add (1, 2);
+			dgv.Rows.Add (1, 2);
+			dgv.Rows.Add (1, 2);
+			dgv.Rows.Add (1, 2);
+
+			dgv.Rows.Clear ();
+
+			Assert.AreEqual (1, dgv.Rows.Count, "A1");
+		}
 	}
 }
 #endif