DevExpress报表每页左侧边距添加动态垂直LabelBrick求助
解决DevExpress报表动态长度垂直侧边标签的最优方案
需求是给所有DevExpress报表页面左侧边距添加垂直水印标签,文本来自数据库、长度不固定。官方示例无法适配动态文本长度,手动计算尺寸的方式灵活性差,以下是更优实现方案:
核心优化思路
- 利用报表打印系统的图形对象自动测量文本尺寸,替代硬编码的尺寸系数
- 基于页面边距和文本尺寸动态计算标签位置,确保标签始终居中于左侧边距且不超出范围
- 通过报表的
AfterPrint事件批量处理所有页面,避免重复代码
优化后的代码实现
Private Sub AddVerticalMarginLabels(ByVal report As DevExpress.XtraReports.UI.XtraReport) Dim printingSystem = report.PrintingSystem Dim font = New Font("Arial", 12, FontStyle.Bold) '可根据需求调整字体 Dim labelText = "从数据库获取的动态文本" '实际替换为数据库查询结果 '遍历所有页面 For Each page As Page In printingSystem.Pages '使用PrintingSystem的Graphics测量文本实际宽度(垂直旋转后,文本宽度对应标签的高度) Using g = printingSystem.CreateGraphics() Dim textSize = g.MeasureString(labelText, font) '垂直旋转后,标签的实际尺寸需要交换宽高:原文本宽度变为标签高度,原高度变为标签宽度 Dim brickSize = New SizeF(textSize.Height, textSize.Width) '计算左侧边距内的居中位置 'X坐标:左侧边距的中间位置,留出少量空白避免贴边 Dim posX = page.MarginsF.Left / 2 - brickSize.Width / 2 'Y坐标:页面内容区域的垂直中心(边距顶部 + 内容高度的一半 - 标签高度的一半) Dim posY = page.MarginsF.Top + (page.Size.Height - page.MarginsF.Top - page.MarginsF.Bottom - brickSize.Height) / 2 '创建垂直标签Brick Dim labelBrick As New LabelBrick() With { .Angle = 90, .Font = font, .Text = labelText, .CanShrinkAndGrow = True, '开启自动伸缩适配文本 .Style = {.TextAlignment = TextAlignment.MiddleCenter} } '初始化Brick的位置和尺寸 labelBrick.Initialize(printingSystem, New RectangleF(New PointF(posX, posY), brickSize)) '将Brick添加到页面的前景层(或背景层,根据需求调整) page.AddBrick(labelBrick) End Using Next End Sub
使用方式
在报表的AfterPrint事件中调用该方法:
Private Sub XtraReport1_AfterPrint(sender As Object, e As EventArgs) Handles MyBase.AfterPrint AddVerticalMarginLabels(Me) End Sub
方案优势
- 完全适配动态文本:无论文本长短,都会自动计算最合适的尺寸,不会出现截断或空白浪费
- 位置自动居中:标签始终位于左侧边距垂直居中位置,无需手动调整偏移量
- 低耦合易维护:逻辑封装为独立方法,可快速复用在不同报表中
内容的提问来源于stack exchange,提问作者Eiffel65
相关产品推荐
相关产品推荐

