如何将填充其他表单数据的自定义User Control转换并保存为图片
问题根因
你生成的UserControl截图没有填充数据,核心原因是截图操作执行顺序错误:你在给PaySlip1控件赋值所有业务字段之前,就调用了DrawToBitmap生成截图,此时控件还是初始空白状态,自然没有数据。
修正方案
调整AddIncomingmsd方法内的代码顺序,等所有字段赋值完成、控件完成布局渲染后,再执行截图操作,同时补充强制布局刷新逻辑避免渲染未完成。
修正后的AddIncomingmsd方法
void AddIncomingmsd(String Name, String ID, String Date, String Department, String Sched, String Pos, String basic, String Holiday, String overtime, String Leave, String tbasic, String tHoliday, String tovertime, String tLeave, String tincome, String sss, String phic, String pib, String tax, String cash, String deduct, String net, string date, string company) { var payslip = new PaySlip1(); pnlcontainer.Controls.Add(payslip); payslip.BringToFront(); payslip.Dock = DockStyle.Top; payslip.Padding = new Padding(0, 10, 0, 0); // 先给控件所有字段赋值 payslip.Empname = Name; payslip.Empid = ID; payslip.payperiod = Date; payslip.depart = Department; payslip.sched = Sched; payslip.position = Pos; payslip.nname = Name; payslip.iid = ID; payslip.payp = Date; payslip.date = date; payslip.basic = basic; payslip.holiday = Holiday; payslip.overtime = overtime; payslip.leave = Leave; payslip.tbasic = tbasic; payslip.tholiday = tHoliday; payslip.tovertime = tovertime; payslip.tleave = tLeave; payslip.tincome = tincome; payslip.SSS = sss; payslip.PHIC = phic; payslip.PIB = pib; payslip.tax = tax; payslip.Cashadv = cash; payslip.tDeduct = deduct; payslip.net = net; payslip.company = company; // 赋值完成后强制控件执行布局刷新,确保所有内容渲染完成 payslip.PerformLayout(); // 等渲染完成后再执行截图 b = new Bitmap(payslip.Width, payslip.Height); payslip.DrawToBitmap(b, new Rectangle(0, 0, b.Width, b.Height)); }
额外优化建议
- 如果不需要在界面上展示该UserControl,仅需生成截图,可以不用把控件添加到
pnlcontainer容器中,手动指定控件的Size属性后直接调用payslip.CreateControl()创建控件句柄,再执行截图即可,不会占用界面控件资源。 - 你当前保存逻辑中文件名后缀是
.jpg,但实际保存的是BMP格式,建议统一格式,如需保存JPG可修改为b.Save(Stream, ImageFormat.Jpeg)。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

