I have a strange problem. I have a TabControl
with two TabPages
. Each page has a datagridview
. Both datagridviews
are populated with XML
files.
I want to have the AutoSizeColumnsMode
set to "Fill
" for both DataGridViews
. I want to set the width of columns in my code.
And everything works fine for the TabPage1
but setting width for the DataGridView
on TabPage2
throws the NullReferenceException
.
I really don't get it because I do the same thing as for datagridview1
and there works fine but datagridview2
throws the exception. Additionally, there is no exception if I choose any AutoSizeColumnsMode
value but Fill
.
Here's the code:
XmlReader xmlFile = XmlReader.Create("File1.xml", new XmlReaderSettings());
DataSet ds = new DataSet();
ds.ReadXml(xmlFile);
dataGridView1.DataSource = ds.Tables[0];
dataGridView1.Sort(dataGridView1.Columns[1], ListSortDirection.Ascending);
dataGridView1.Columns[0].Width = 35;
dataGridView1.Columns[1].Width = 248;
dataGridView1.Columns[2].Width = 110;
dataGridView1.Columns[3].Width = 140;
dataGridView1.Columns[9].Width = 127;
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[1].Visible = true;
dataGridView1.Columns[2].Visible = true;
dataGridView1.Columns[3].Visible = true;
dataGridView1.Columns[4].Visible = false;
dataGridView1.Columns[5].Visible = false;
dataGridView1.Columns[6].Visible = false;
dataGridView1.Columns[7].Visible = false;
dataGridView1.Columns[8].Visible = false;
dataGridView1.Columns[9].Visible = true;
dataGridView1.Columns[10].Visible = true;
dataGridView1.Columns[10].Width = 100;
xmlFile.Close();
XmlReader xmlFile2= XmlReader.Create("File2.xml", new XmlReaderSettings());
DataSet ds2 = new DataSet();
ds2.ReadXml(xmlFile2);
dataGridView2.DataSource = ds2.Tables[0];
dataGridView2.Columns[0].Width = 135; // The exception is thrown here
dataGridView2.Columns[9].Width = 200;
dataGridView2.Columns[8].Width = 300;
dataGridView2.Columns[7].Width = 70;
dataGridView2.Columns[6].Width = 70;
dataGridView2.Columns[5].Width = 124;
dataGridView2.Columns[4].Width = 81;
dataGridView2.Columns[3].Width = 70;
dataGridView2.Columns[2].Width = 70;
dataGridView2.Columns[1].Width = 124;
dataGridView2.Columns[0].Visible = true;
dataGridView2.Columns[1].Visible = true;
dataGridView2.Columns[2].Visible = true;
dataGridView2.Columns[3].Visible = true;
dataGridView2.Columns[4].Visible = true;
dataGridView2.Columns[5].Visible = false;
dataGridView2.Columns[6].Visible = false;
dataGridView2.Columns[7].Visible = false;
dataGridView2.Columns[9].Visible = false;
xmlFile2.Close();
This is because a data-bound control(dataGridView2
) is not updated until the control is made visible. See this. You can refresh the binding, for example, by programmatically switching to TabPage2
and back to the first tab.
THe only thing I can se at the moment is that you are not doing this on tabpage 2
dataGridView1.Sort(dataGridView1.Columns[1], ListSortDirection.Ascending);
try
dataGridView2.Sort(dataGridView2.Columns[1], ListSortDirection.Ascending);
来源:https://stackoverflow.com/questions/17030531/strange-issue-with-a-datagridview-and-a-tabcontrol-c-sharp