【问题标题】:How Insert Detail Rows As Columns In DevExpress Reports如何在 DevExpress 报告中将详细信息行作为列插入
【发布时间】:2015-03-17 13:28:16
【问题描述】:

我正在使用 DevExpress 报告,我需要在一行中插入两个详细信息行,例如像这样(每个详细信息行 1 列):

------------------------------------
     Detail1   |      Detail2
------------------------------------

目前,当我插入详细信息第 2 行时,它是在详细信息第 1 行下插入,例如:

-----------------------------------
           Detail1
-----------------------------------
           Detail2
-----------------------------------

我该如何解决这个问题?

【问题讨论】:

  • 不清楚你为什么需要这个。为什么不在一个详细信息中插入所有您需要的内容,如果需要,在一个详细信息中插入两个表格?

标签: devexpress xtrareport


【解决方案1】:

您可以使用XRSubreport 对象在一行中显示两个详细信息,方法是将两个子报表并排放置0。因此,只需将两个 XRSubreport 对象放入您的 DetailBand 并使用 XRSubreport.BeforePrint 事件处理程序为子报表提供详细信息1
示例如下:

public void ShowReport()
{
    var masters = new List<Master>();

    var random = new Random();

    for (int index = 0; index < 100; index++)
    {
        var master = new Master() { ID = index, Name = "Master_" + index };

        var detailCount = random.Next(1, 10);
        for (int detailIndex = 0; detailIndex < detailCount; detailIndex++)
        {
            var detail0 = new Detail0() { ID = detailIndex, Name = "Detail_0_" + detailIndex };
            master.Details0.Add(detail0);
        }

        detailCount = random.Next(1, 10);
        for (int detailIndex = 0; detailIndex < detailCount; detailIndex++)
        {
            var detail1 = new Detail1() { ID = detailIndex, Name = "Detail_1_" + detailIndex };
            master.Details1.Add(detail1);
        }

        masters.Add(master);
    }

    var report = new XtraReport();

    var detailBand = CreateDetailBand(report, masters);
    detailBand.HeightF = 40;

    var detailReport0 = new XtraReport();
    CreateDetailBand(detailReport0, null);

    var subReport0 = new XRSubreport() { LocationF = new PointF(20, 20), WidthF = 150, ReportSource = detailReport0 };
    subReport0.BeforePrint += (s, e) =>
    {
        var currentReport = ((XRSubreport)s);
        var master = ((Master)currentReport.Report.GetCurrentRow());
        currentReport.ReportSource.DataSource = master.Details0;
    };

    detailBand.Controls.Add(subReport0);

    var detailReport1 = new XtraReport();
    CreateDetailBand(detailReport1, null);

    var subReport1 = new XRSubreport() { LocationF = new PointF(170, 20), WidthF = 150, ReportSource = detailReport1 };
    subReport1.BeforePrint += (s, e) =>
    {
        var currentReport = ((XRSubreport)s);
        var master = ((Master)currentReport.Report.GetCurrentRow());
        currentReport.ReportSource.DataSource = master.Details1;
    };

    detailBand.Controls.Add(subReport1);

    report.DataSource = masters;

    report.ShowRibbonPreview();
}

public DetailBand CreateDetailBand(XtraReport report, object DataSource)
{
    var detailBand = new DetailBand() { HeightF = 20 };

    var label = new XRLabel();
    label.DataBindings.Add(new XRBinding("Text", DataSource, "ID"));

    detailBand.Controls.Add(label);

    label = new XRLabel() { LeftF = 30 };
    label.DataBindings.Add(new XRBinding("Text", DataSource, "Name"));

    detailBand.Controls.Add(label);

    report.Bands.Add(detailBand);

    return detailBand;
}

public class Master
{
    public Master()
    {
        Details0 = new List<Detail0>();
        Details1 = new List<Detail1>();
    }

    public int ID { get; set; }
    public string Name { get; set; }

    public List<Detail0> Details0 { get; private set; }
    public List<Detail1> Details1 { get; private set; }
}

public class Detail0
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Detail1
{
    public int ID { get; set; }
    public string Name { get; set; }
}

这里是截图:

0How to: Create a Side-by-Side Report
1How to: Create a Master-Detail Report using Subreports

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多