C# DataGridView列宽在DataGridView可见之前返回100

C# DataGridView列宽在DataGridView可见之前返回100,c#,winforms,datagridview,C#,Winforms,Datagridview,我正在将DataGridView添加到TabControl的未选中选项卡,并手动调整最后n列的大小以填充剩余空间。前三列是静态的,使用AutoSizeMode AllCells 我想做的是,得到DataGridView的宽度,并减去垂直滚动条的19,然后减去前三列的宽度,然后再将剩余宽度除以n,并为每一列分配剩余宽度。当我添加DataGridView时,有一些输出显示(DataGridView此时不可见): 最初的三列报告的宽度均为100,这是不正确的。当我转到选项卡时,DataGridView

我正在将DataGridView添加到TabControl的未选中选项卡,并手动调整最后n列的大小以填充剩余空间。前三列是静态的,使用AutoSizeMode AllCells

我想做的是,得到DataGridView的宽度,并减去垂直滚动条的19,然后减去前三列的宽度,然后再将剩余宽度除以n,并为每一列分配剩余宽度。当我添加DataGridView时,有一些输出显示(DataGridView此时不可见):

最初的三列报告的宽度均为100,这是不正确的。当我转到选项卡时,DataGridView处于打开状态,DataGridView Resize事件触发,我得到:

Initial Available Width: 1074
Updated Available Width: 974
Updated Available Width: 874
Updated Available Width: 774
Remaing Columns Width: 129
仍然显示前三列的100宽度,因此,由于最后n列的宽度超过实际可用空间,水平滚动条可见。在选项卡上,我有一些测试代码来获取当前宽度:

DGV Width  : 1093
Col 1 Width: 411
Col 2 Width: 40
Col 3 Width: 36
Col 4 Width: 129
Col 5 Width: 129
Col 6 Width: 129
Col 7 Width: 129
Col 8 Width: 129
Col 9 Width: 129
因此,除了前三列没有报告其真实宽度之外,所有内容都按预期工作。但是,当我在触发DataGridView resize事件的窗体上稍微手动调整大小时,会得到以下结果:

Initial Available Width: 1074
Updated Available Width: 663
Updated Available Width: 623
Updated Available Width: 587
Remaing Columns Width: 97
这就好像DataGridView实际上不可见时,它无法计算AutoSizeMode AllCells的宽度

我尝试调用AutoResizeColumns(),但它没有改变任何东西,AutoSizeMode Fill不符合我对最后n列的要求

编辑:回复Ohse的评论:

我也这么认为,但经过进一步调查,这似乎更多地与家长控制有关。我有一个带有两个选项卡的顶级选项卡控件-在tab2中,还有一个在运行前没有选项卡的选项卡控件。当我在选择tab2的同时向tab2添加一个tabpage(带有datagridview)时,即使是第2、第3…第n次添加,列宽也会进行完美的调整,这与第一次添加不一样(我不会更改所选索引,所以它只会在第一个选项卡上显示)


但是,如果在顶级选项卡控件中选择tab1时,将tabpage(带有datagridview)添加到tab2选项卡控件,即列宽报告不正确。

如果DGV或包含表单不可见,则自动调整大小的列将返回100的宽度作为默认行为。在调用resize方法之前,您可能必须手动设置可见性,就像我在相关问题上为同一问题显示的那样。我在问题的底部添加了一些,以回应您的评论@Ohbousei,我想知道当选择tab1时是否
tab2.Visible==False
。在这个
DataGridView
的层次结构中的某个地方,某些东西必须满足这个标准才能导致这种情况,imho。
Initial Available Width: 1074
Updated Available Width: 663
Updated Available Width: 623
Updated Available Width: 587
Remaing Columns Width: 97