XRLabel文本仅在Letter纸张类型显示,其他类型无内容问题排查
报表标签仅Letter纸显示文本的问题排查与解决
我需要在报表页面显示标签,每个标签展示表达式拼接的数据源信息,同时支持通过自定义选项设置边距、宽高和间距来计算页面尺寸。但现在只有纸张类型ID=3(Letter)时XRLabel的文本能正常显示,切换到A4或其他纸张类型时,页面只显示标签区块边框,没有文本内容。
控件创建代码
DetailBand detail = new DetailBand(); report.Bands.Add(detail); XRPanel panel = new XRPanel(); panel.CanGrow = false; detail.Controls.Add(panel); panel.WidthF = labelWidth; panel.HeightF = labelHeight; panel.Borders = BorderSide.All; panel.Name = "Panel1"; XRLabel lblMail = new XRLabel(); lblMail.Name = "lblMail"; lblMail.TextAlignment = TextAlignment.MiddleCenter; lblMail.HeightF = labelHeight; lblMail.WidthF = labelWidth; lblMail.CanGrow = false; lblMail.CanShrink = false; lblMail.Multiline = true; panel.Controls.Add(lblMail);
数据源填充代码
XRLabel lblMail = (XRLabel)labelReport.FindControl("lblMail", false); string expression = "[OwnerName] + Char(10) + [Address1] + Char(10) + [Address2] + Char(10) + [City]" + " + ',' + [State] + ' ' + [Zip]"; ExpressionBinding expressionBinding = new ExpressionBinding("BeforePrint", "Text", expression); lblMail.ExpressionBindings.Add(expressionBinding); labelReport.DataSource = reportSource;
非Letter纸张类型下,页面仅显示带边框的空白标签区块,无文本内容。
排查与解决方向
检查页面尺寸计算逻辑
切换纸张类型时,自定义计算的labelWidth和labelHeight可能出现异常:- 若计算后的尺寸过小,加上
CanGrow=false和CanShrink=false的限制,文本会被完全隐藏 - 确认切换纸张时,
labelWidth和labelHeight是否根据新纸张尺寸重新计算,并正确赋值给panel和label控件
- 若计算后的尺寸过小,加上
整合表达式绑定到控件创建流程
当前通过FindControl获取控件后绑定表达式,若切换纸张时报表重新生成控件,原绑定会丢失:- 将表达式绑定逻辑直接整合到控件创建代码中,确保每次生成控件时都完成绑定:
XRLabel lblMail = new XRLabel(); lblMail.Name = "lblMail"; lblMail.TextAlignment = TextAlignment.MiddleCenter; lblMail.HeightF = labelHeight; lblMail.WidthF = labelWidth; lblMail.CanGrow = false; lblMail.CanShrink = false; lblMail.Multiline = true; // 直接在控件创建时添加表达式绑定 string expression = "[OwnerName] + Char(10) + [Address1] + Char(10) + [Address2] + Char(10) + [City]" + " + ',' + [State] + ' ' + [Zip]"; ExpressionBinding expressionBinding = new ExpressionBinding("BeforePrint", "Text", expression); lblMail.ExpressionBindings.Add(expressionBinding); panel.Controls.Add(lblMail);
- 将表达式绑定逻辑直接整合到控件创建代码中,确保每次生成控件时都完成绑定:
确保纸张切换后数据源重新绑定
切换纸张类型后,需确认labelReport.DataSource被正确重新赋值,避免因数据源丢失导致表达式无法解析数据调试表达式解析结果
在非Letter纸张类型下,添加手动拼接文本的调试逻辑,判断是绑定问题还是尺寸问题:// 给lblMail绑定BeforePrint事件 private void lblMail_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) { XRLabel label = sender as XRLabel; if (label != null) { var currentRow = labelReport.GetCurrentRow(); // 手动拼接文本测试数据是否能正常获取 string text = $"{DataBinder.Eval(currentRow, "OwnerName")}\n{DataBinder.Eval(currentRow, "Address1")}\n{DataBinder.Eval(currentRow, "Address2")}\n{DataBinder.Eval(currentRow, "City")}, {DataBinder.Eval(currentRow, "State")} {DataBinder.Eval(currentRow, "Zip")}"; label.Text = text; } }
内容的提问来源于stack exchange,提问作者Konstantin Didenko
相关产品推荐
相关产品推荐

