0

我的表单上有一个 TabControl,有两页。每个页面都包含一个datagridview。如果Form.Load我从 SQL 数据库填充我的 datagridviews 并更改这些网格的某些列宽。

 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;
                }        
             }
      }

我的两个数据网格视图都从数据库中获取数据。对于我的第一个 datagridview,一切正常。但是,当我尝试在第二个 TabPage 上更改第二个 datagridview 的列宽时,我收到一条消息Object reference not set to an instance of an object。但为什么?在下面的屏幕截图中,您可以看到第二个 datagridview 的列名存在,但我无法更改它的列宽。

错误截图

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

4

3 回答 3

7

我有同样的问题。显然发生崩溃是因为未显示控件。我在表单的 Shown() 事件中设置了宽度,然后它对我有用。

于 2012-11-09T21:57:07.840 回答
4

当我自己尝试时,我无法重现您的问题。但是,如果您事先知道列名,我会使用这种方法:

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;

这样它就可以自动调整您的宽度而无需您的干预。

于 2012-08-08T14:37:01.070 回答
-1

当我尝试通过此代码调整列大小时,我遇到了同样的异常:

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

问题是因为我将数据网格视图属性自动大小列模式设置为填充以填充容器,但是当我将其设置回 null 时,一切都很好。

于 2017-05-13T20:35:41.947 回答