【问题标题】:How to get the size of a TableLayoutPanel before drawing it?如何在绘制之前获取 TableLayoutPanel 的大小?
【发布时间】:2014-11-22 04:42:41
【问题描述】:

我需要从数据库中打印一些表格数据,我决定先将它们填充到临时 TableLayoutPanel 中,以便它为我处理可变长度。然后将其绘制到 PrintDocument,如下所示:

Using printImage As New Bitmap(Table.Width, Table.Height) 'Need to know size here

   Table.DrawToBitmap(printImage, new Rectangle(0, 0, _
   printImage.Width,printImage.Height));                  'But draw is here!
   e.Graphics.DrawImage(printImage, New Point(0, PrintPos))   

End Using

请注意,图像的大小是在实际绘制控件之前声明的。这不起作用,因为 tableLayoutPanel 的调整大小只发生在绘图时(我猜是这样)!打印预览中只绘制了表格的一部分。

我已经尝试手动设置尺寸如下:

Table.Autosize = False
Table.Size = Table.PreferredSize 

但只有在调整单元格大小的情况下才会返回正确的大小,因为内容长,不会发生。还有其他方法可以在绘制控件之前获取控件的大小吗?

【问题讨论】:

    标签: .net vb.net winforms tablelayoutpanel


    【解决方案1】:

    我已经解决了!设置完所有数据、行/列样式等后运行以下代码:

    Table.AutoSize = True
    Using pan As New Panel
        pan.Controls.Add(Table)    'Add the table to a temp Panel,
        pan.Controls.Remove(Table) 'to force resize
    End Using
    

    并且 Table.Size 将返回正确的大小!这有点hacky,但对我有用。

    旁注:要制作一个既能自动调整其高度又适合纸张宽度的表格,请执行以下操作

    Table.MaximumSize = New Size(PaperWidth, 0) 'Set maximum width only
    

    【讨论】:

      【解决方案2】:

      是的,处理 SizeChanged 事件并使用大小更新类级别变量。然后当你绘制时,你就会知道你试图绘制的控件的大小。

      【讨论】:

      • SizeChanged 事件是否发生在它的任何祖先(容器)中?您可能还想查看Control.WndProc 方法。
      猜你喜欢
      • 2019-10-13
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多