2014-11-22 77 views
1

我需要从数据库打印一些表格数据,我决定先将这些数据填充到一个临时的TableLayoutPanel中,以便它能够为我处理可变长度。然后,它被吸引到一个PrintDocument的如下: 如何在绘制之前获取TableLayoutPanel的大小?

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 

但是,只有在调整细胞的情况下返回正确的尺寸,由于长期内容,不发生。在绘制之前是否有其他方法可以获得控件的大小?

回答

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将返回正确的大小!这有点哈克,但为我工作。

边注:为了使表都自动调整大小的高度和适合纸张宽度,请执行下列操作

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

是的,处理SizeChanged事件并保持更新大小的类级变量。然后当你画画的时候,你会知道你想要画的控件的大小。

+0

试用了一下,SizeChanged将不会发生在所有... – jack3694078 2014-11-24 02:17:31

+0

是否'SizeChanged'事件发生在它的任何祖先(容器)?你可能也想看看'Control.WndProc'方法。 – toddmo 2014-11-25 03:27:30

相关问题