2012-08-08 33 views
0

我的窗体上有两个页面的TabControl。每个页面都包含一个datagridview。在Form.Load事件中,我正在填充SQL数据库中的datagridviews,并更改这些网格的一些列宽。如何更改放置在不同TabControl页面上的datadridview列宽度

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的列名存在,但我无法更改它的列宽。

Error screenshot

我做错了什么?我的数据网格不是空的并且包含数据。我应该首先激活我的TabPage还是其他的?

回答

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; 

因此它会自动调整你的宽度,无需人工干预。

+0

非常感谢!它在这种情况下工作:col.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;但无论如何,这很奇怪,为什么我不能改变列的宽度,如col.Width = 30. – mbigun 2012-08-08 15:26:42

7

我有同样的问题。显然发生崩溃是因为控制不显示。我在窗体的Shown()事件中设置了宽度,然后它对我有效。

+0

这对我来说也是如此 – 2013-01-27 07:15:01

+1

甚至更​​好,我们应该在ColumnAdded事件处理程序中完成这项工作,它始终以这种方式工作:) – 2013-05-17 14:55:40

-1

我有同样的异常,当我试图通过这个代码,以调整列:

this.DGVproOrder.Columns[0].Width = 86; 
this.DGVproOrder.Columns[1].Width = 166; 
... 

问题是因为我设置数据网格视图属性自动调整大小列模式,以填补填充容器,但是当我把它设置为空,每件事情都很好。

相关问题