You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取DevExpress Reporting中XRControl(如标签)的位置,判断两标签是否同页

在DevExpress Reporting中判断XRControl是否在同一页面

BeforePrint事件确实无法获取控件的实际位置和页码——这个事件触发时,报表还处于布局计算的前期阶段,控件的PageIndex、LocationF等位置相关属性尚未被赋值。要判断两个控件是否在同一页面,需要在布局完成后获取这些属性,推荐使用以下两种方式:

方式一:利用XRControl的AfterPrint事件

AfterPrint事件会在控件完成页面布局并准备打印后触发,此时控件的页码和位置信息已经完全确定。

实现步骤:

  • 为需要判断的两个标签控件(比如xrLabel1、xrLabel2)分别添加AfterPrint事件处理程序
  • 在事件中记录每个控件的PageIndex值
  • 对比两个控件的PageIndex,若值不同则说明不在同一页面

代码示例(C#):

private int label1PageIndex = -1;
private int label2PageIndex = -1;

private void xrLabel1_AfterPrint(object sender, EventArgs e)
{
    var label = sender as XRLabel;
    if (label != null)
    {
        label1PageIndex = label.PageIndex;
    }
}

private void xrLabel2_AfterPrint(object sender, EventArgs e)
{
    var label = sender as XRLabel;
    if (label != null)
    {
        label2PageIndex = label.PageIndex;
    }
}

// 在报表的PrintOnPage事件或其他后期事件中判断
private void XtraReport1_PrintOnPage(object sender, PrintOnPageEventArgs e)
{
    if (label1PageIndex != -1 && label2PageIndex != -1)
    {
        bool isOnSamePage = label1PageIndex == label2PageIndex;
        // 根据isOnSamePage的值执行后续逻辑
    }
}

方式二:遍历报表的PrintDocument获取控件位置

如果需要在报表生成完成后统一判断,可以通过报表的PrintDocument属性遍历所有打印页面,查找控件所在的页码:

// 报表生成完成后调用
private void CheckControlsPage(XtraReport report)
{
    report.CreateDocument();
    var label1 = report.FindControl("xrLabel1", true) as XRLabel;
    var label2 = report.FindControl("xrLabel2", true) as XRLabel;

    if (label1 != null && label2 != null)
    {
        bool isSamePage = label1.PageIndex == label2.PageIndex;
        // 处理逻辑
    }
}

注意事项:

  • PageIndex属性从0开始计数,不同页面的控件会有不同的索引值
  • 如果控件存在跨页显示的情况(比如内容过长被拆分到多页),PageIndex会返回控件起始所在的页码,此时可以结合BoundsF属性判断控件是否跨页

内容的提问来源于stack exchange,提问作者thesavvyguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:42:14