我的表单上有一个带有两页的TabControl。每个页面都包含一个datagridview。在Form.Load
事件中,我从SQL填充数据网格数据库并更改这些网格的一些列宽。
DataTable GLOBAL_TABLE = new DataTable();
object[] GLOBAL_PARAMETERS = new object[50];
private void frmMAIN_Load(object sender, EventArgs e)
{
LOAD_TAB_1();
LOAD_TAB_2();
}
void LOAD_TAB_1()
{
//SQLRELATION class contain method that execute stored procedure on server
//and return DataTAble
Array.Clear(GLOBAL_PARAMETERS, 0, GLOBAL_PARAMETERS.Length);
GLOBAL_PARAMETERS[0] = userID;
GLOBAL_PARAMETERS[1] = date_1.Date;
GLOBAL_PARAMETERS[2] = date_2.Date;
GLOBAL_TABLE = SQLRELATION.GET_PROCEDURE("PROC023", GLOBAL_PARAMETERS, true);
dgv_MAIN_substitution.DataSource = GLOBAL_TABLE;
//Here I'm changing my columns width
foreach (DataGridViewColumn col in dgv_MAIN_substitution.Columns)
{
switch (col.Name)
{
case "Dummy": col.Width = 30; break;
case "MOQ": col.Width = 30; break;
case "Inactive": col.Width = 30; break;
default: break;
}
}
}
void LOAD_TAB_2()
{
//The same I'm doing for the second datagridview
Array.Clear(GLOBAL_PARAMETERS, 0, GLOBAL_PARAMETERS.Length);
GLOBAL_PARAMETERS[0] = userID;
GLOBAL_PARAMETERS[1] = date_1.Date;
GLOBAL_PARAMETERS[2] = date_2.Date;
GLOBAL_TABLE = SQLRELATION.GET_PROCEDURE("PROC023", GLOBAL_PARAMETERS, true);
dgv_MAIN_orders.DataSource = GLOBAL_TABLE;
//Changing my columns width for second datagrigview
foreach (DataGridViewColumn col in dgv_MAIN_orders.Columns)
{
switch (col.Name)
{
//Error if HERE!
case "Status": col.Width = 30; break;
case "PO Number": col.Width = 150; break;
default: col.Width = 40; break;
}
}
}
我的两个datagridviews都是从数据库中获取数据。对于我的第一个datagridview,一切都很好。但是当我尝试在第二个TabPage上更改第二个datagridview的列宽时,我收到一条消息Object reference not set to an instance of an object
。但为什么?在下面的屏幕截图中,您可以看到第二个datagridview的列名存在,但我无法更改它的列宽。
我做错了什么?我的datagrid不是空的并且包含数据。我应该先激活我的TabPage还是别的什么?
答案 0 :(得分:7)
我遇到了同样的问题。显然发生崩溃是因为没有显示控件。我在表单的Shown()事件中设置宽度,然后它对我有效。
答案 1 :(得分:3)
当我尝试自己时,我无法重现你的问题。但是,如果您事先知道列名,我会使用这种方法:
dgv_MAIN_substitution.Columns["Dummy"].Width = 30;
dgv_MAIN_substitution.Columns["MOQ"].Width = 30;
dgv_MAIN_substitution.Columns["Inactive"].Width = 30;
和
dgv_MAIN_orders.Columns["Status"].Width = 30;
dgv_MAIN_orders.Columns["PO Number"].Width = 150;
比foreach循环和switch语句更干净。您可以做的另一件事是设置Column.AutoSizeMode:
dgv_MAIN_orders.Columns["PO Number"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
这样它可以自动调整宽度而无需您的干预。
答案 2 :(得分:-1)
当我尝试通过此代码调整列的大小时,我遇到了同样的异常:
this.DGVproOrder.Columns[0].Width = 86;
this.DGVproOrder.Columns[1].Width = 166;
...
问题是因为我将数据网格视图属性自动大小列模式设置为填充以填充容器,但是当我将其设置为null时,每个东西都运行良好。