winforms 如何更改放置在不同TabControl页上的datadridview列宽度

3ks5zfa0  于 2023-04-07  发布在  其他
关注(0)|答案(4)|浏览(148)

我的表单上有一个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都从数据库获取数据。对于我的第一个datagridview,一切正常。但是当我试图在第二个TabPage上更改第二个datagridview的列宽时,我得到一条消息Object reference not set to an instance of an object。但是为什么呢?在下面的屏幕截图中,你可以看到第二个datagridview的列名存在,但是我不能更改它的列宽。

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

fsi0uk1n

fsi0uk1n1#

我遇到了同样的问题。显然崩溃是因为控件没有显示。我在窗体的Shown()事件中设置了宽度,然后它就为我工作了。

6gpjuf90

6gpjuf902#

我不能重现你的问题,当我尝试了我自己.然而,如果你知道你的列名之前手,我只会使用这种方法:

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;

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

ergxz8rk

ergxz8rk3#

我使用此代码设置列宽,然后由用户Public Sub SetGridColWidthsAuto(ByRef DG As DataGridView)存储宽度'将提供的Datagrid中的所有列设置为自动调整大小。'设置列宽属性'将它们重新设置为不自动调整大小,以便用户可以调整它们的大小

Try

        Dim MyWidth As Integer

        DG.EndEdit()

        ' Auto Fit
        For i = 0 To DG.Columns.Count - 2
            DG.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
        Next i

        ' Set last column to AutoFill
        DG.Columns(DG.Columns.Count - 1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill

        DG.Refresh()

        ' Set width to current width, and set to not auto fill
        For i = 0 To DG.Columns.Count - 1
            MyWidth = DG.Columns(i).Width
            DG.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.None
            DG.Columns(i).Width = MyWidth
        Next

    Catch ex As Exception
        MsgBox("Error in function <SetGridColWidthsAuto>:" + vbCrLf + ex.Message)
    End Try
End Sub

但是我发现它不起作用,除非标签控件是通过选定索引选择的。
从加载或显示。当然,我已经尝试了刷新的DG沙标签控件,整个形式,并更新。有某种片状在那里

3htmauhk

3htmauhk4#

当我尝试通过以下代码调整列的大小时,也出现了同样的异常:

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

问题是因为我设置了数据网格视图属性auto size columns mode来填充容器,但是当我将它设置回null时,一切都工作得很好。

相关问题