WinForm下DatagridView自适应列宽的问题。

FainSheeg 2017-11-29 07:07:43
最近自己写了个自定义控件,用DataGridView、ToolStripControlHost、ToolStripDropDown写了个多列多功能的下拉控件,所有功能已实现,测试却发现个奇怪的问题:首次下拉时DGV宽度不能自适应,下拉过一次之后,以后下拉就能自适应了。
DGV宽度自适应的代码如下:

‘以下代码在为DGV绑定DataSource之后才运行
Dim w As Integer = 0
For Each dgvc As DataGridViewColumn In DGV.Columns
If dgvc.Visible = True Then
w = w + dgvc.Width
End If
Next
DGV.Width=w

大意就是各列宽度之和,并且在创建DGV实例时已设置列宽自适应:

DGV = New DataGridView With {.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells}

测试发现首次下拉的情况下,计算w时循环获得的各列宽竟然还是初始的100,并没有自适应列宽,但显示出来之后,各列却是已经自适应列宽了。试了好多种方法解决不了。后来一想:为什么首次下拉会这样,再下拉就不会了,唯 一的区别就是“DGV有没有向用户显示过”。于是想了个折衷方法:设置DGV的父窗体透明度为0(不要问我既然DGV是做下拉的怎么会有父窗体),然后Show,然后.Visible=False,在下拉之前,先显示一次,问题解决。
但是,只是问题解决,却不知道原因,所以上来求助大神了。给个解释,以及针对性的解决方法,不要我这种绕路的解决方法。
...全文
2432 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
轻鸿万里 2017-12-28
  • 打赏
  • 举报
回复
DataGridView1.RowPostPaint事件里添加AutoResizeColumns()试试 不知道会不会卡
FainSheeg 2017-12-20
  • 打赏
  • 举报
回复
引用 5 楼 looptotoo的回复:
执行完语句前,加入这句结尾 DataGridView1.AutoResizeColumns()
试过,然并卵
looptotoo 2017-12-20
  • 打赏
  • 举报
回复
执行完语句前,加入这句结尾 DataGridView1.AutoResizeColumns()
FainSheeg 2017-12-07
  • 打赏
  • 举报
回复
自己再顶
FainSheeg 2017-12-02
  • 打赏
  • 举报
回复
测试发现在DGV的VisibleChange事件里检测列宽不会出现问题。其实也还是要显示一次才能自适应列宽,不知道DGV的自适应列宽是怎样的原理。自己顶一下。
FainSheeg 2017-11-30
  • 打赏
  • 举报
回复
引用 1 楼 daixf_csdn 的回复:
测试发现首次下拉的情况下,计算w时循环获得的各列宽竟然还是初始的100 --- 不知道你判断代码写在哪里的,你试试在Shown事件中检查: this.Shown += new System.EventHandler(this.Form1_Shown);
事实上如果不用我的绕路的方法,按我原来的设计根本不会触发这个事件的,DGV的父窗体从来都不会Show,另我的判断代码是放在列表下拉之前,也就是mydropdown.show之前。
圣殿骑士18 2017-11-30
  • 打赏
  • 举报
回复
测试发现首次下拉的情况下,计算w时循环获得的各列宽竟然还是初始的100 --- 不知道你判断代码写在哪里的,你试试在Shown事件中检查: this.Shown += new System.EventHandler(this.Form1_Shown);

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧