0

rdl スキーマから生成したオブジェクト モデルを使用して、プログラムで rdl を作成しようとしています。まず、ヘッダー フッターと本文、およびデータソースとデータセット セクションを含む既存の rdl テンプレートをファイル ストリームに読み込みます。

string docpath = "RDLTemplates/TemplateLetter.rdl";
Report myReport = null;

using (FileStream fs = new FileStream(docpath, FileMode.Open))
{
    XmlSerializer serializer = new XmlSerializer(typeof(Report));
    myReport = (Report)serializer.Deserialize(fs);

}
return myReport;

次に、これをメソッドに渡しInsertTablix()、ストリームをナビゲートして本文セクションを見つけます

 public Report InsertTablix(Report report, List<string> fieldnames)
        {
            int sectionindex = report.ItemsElementName.ToList().IndexOf(ItemsChoiceType118.ReportSections);
            if (sectionindex != -1)
            {
                ReportSectionsType sections = (ReportSectionsType)report.Items[sectionindex];
                if (sections.ReportSection.Length > 0)
                {  
                    int bodyIndex = sections.ReportSection[0].ItemsElementName.ToList().IndexOf(ItemsChoiceType117.Body);
                    if (bodyIndex != -1)
                    {
                        BodyType body = (BodyType)sections.ReportSection[0].Items[bodyIndex];
                        int tablixindex = body.Items.ToList().IndexOf(ItemsChoiceType80.Tablix);

                        if (tablixindex == -1)
                        {
                           //Here is where I would like to insert the tablix if it doesn't exist  


                        }
                    }
                }

            }

            return report;
        } 

私が立ち往生しているのは、オブジェクトモデルを使用してこの本体に Tablix を作成/挿入する方法です。XML を使用してレポートを作成できることを認識しており、このアプローチを試してみましたが、ObjectModel を使用して、レポート スキーマに準拠し、検証したいと考えていました。

このアプローチを使用して、要素 (tablix、テキストボックスなど) を本文に追加する方法について、だれでも洞察を提供できますか。

-乾杯

4

1 に答える 1

0

私は RDLObjectModel を使用して同じことを行っていますが、理解するのに少し時間がかかりました。これは、Tablix を適切に挿入するために機能した私のテスト コードです (あまりきれいではなく、VB.NET ではありません)。多分あなたはこれが便利だと思うでしょう。

'create tablix - manually
Dim tablixRFoo As New RdlObjectModel.Tablix With {.Top = New RdlObjectModel.ReportSize("0.56875in"), .Width = New RdlObjectModel.ReportSize("0.5in")}
tablixRFoo.Name = "tablix1"
tablixRFoo.DataSetName = dsRFoo.Name

'add tablix columns
    tablixRFoo.TablixBody.TablixColumns.Add(New RdlObjectModel.TablixColumn With {.Width = New RdlObjectModel.ReportSize(2.0)})
    tablixRFoo.TablixBody.TablixColumns.Add(New RdlObjectModel.TablixColumn With {.Width = New RdlObjectModel.ReportSize(2.0)})
    tablixRFoo.TablixBody.TablixColumns.Add(New RdlObjectModel.TablixColumn With {.Width = New RdlObjectModel.ReportSize(2.0)})
    tablixRFoo.TablixBody.TablixColumns.Add(New RdlObjectModel.TablixColumn With {.Width = New RdlObjectModel.ReportSize(2.0)})
    tablixRFoo.TablixBody.TablixColumns.Add(New RdlObjectModel.TablixColumn With {.Width = New RdlObjectModel.ReportSize(2.0)})

...

Dim tColHeirarcy = New RdlObjectModel.TablixHierarchy
Dim tRowHeirarcy = New RdlObjectModel.TablixHierarchy

...

    Dim fields() = {"field1", "field2", "field3", "field4", "field5"}

    'add tablix header row
    Dim tRowHeader = New RdlObjectModel.TablixRow With {.Height = New RdlObjectModel.ReportSize(0.2)}
    For i As Integer = 0 To fields.Length - 1
        Dim tCell = New RdlObjectModel.TablixCell
        Dim tCellContents = New RdlObjectModel.CellContents
        Dim tTextBox As New RdlObjectModel.Textbox
        tTextBox.Name = tablixRFoo.Name & "Header" & "txt" & fields(i).ToString.Replace(" ", "")
        tTextBox.DefaultName = tTextBox.Name
        tTextBox.Paragraphs(0).TextRuns(0).Value = fields(i).ToString
        tTextBox.Paragraphs(0).TextRuns(0).Style.FontSize = New RdlObjectModel.ReportSize("8pt")
        tTextBox.Paragraphs(0).TextRuns(0).Style.TextAlign = RdlObjectModel.TextAlignments.Left
        tTextBox.ZIndex = i
        tCellContents.ReportItem = tTextBox
        tCell.CellContents = tCellContents
        tRowHeader.TablixCells.Add(tCell)

        tColHeirarcy.TablixMembers.Add(New RdlObjectModel.TablixMember)
    Next
    tablixRFoo.TablixBody.TablixRows.Add(tRowHeader)

    'add tablix data rows
    Dim tRow = New RdlObjectModel.TablixRow With {.Height = New RdlObjectModel.ReportSize(0.2)}


    For i As Integer = 0 To fields.Length - 1
        Dim tCell = New RdlObjectModel.TablixCell
        Dim tCellContents = New RdlObjectModel.CellContents
        Dim tTextBox As New RdlObjectModel.Textbox
        tTextBox.Name = tablixRFoo.Name & "txt" & fields(i).ToString.Replace(" ", "")
        tTextBox.DefaultName = tTextBox.Name
        tTextBox.Paragraphs(0).TextRuns(0).Value = "=Fields!" & fields(i).ToString & ".Value"
        tTextBox.Paragraphs(0).TextRuns(0).Style.FontSize = New RdlObjectModel.ReportSize("8pt")
        tTextBox.Paragraphs(0).TextRuns(0).Style.TextAlign = RdlObjectModel.TextAlignments.Left
        tTextBox.ZIndex = i


        tCellContents.ReportItem = tTextBox
        tCell.CellContents = tCellContents
        tRow.TablixCells.Add(tCell)
    Next

    tablixRFoo.TablixBody.TablixRows.Add(tRow)

    Dim rMem = New RdlObjectModel.TablixMember With {.KeepTogether = True}
    Dim rMem2 = New RdlObjectModel.TablixMember With {.Group = New RdlObjectModel.Group With {.Name = "Details"}}
    tRowHeirarcy.TablixMembers.Add(rMem)

    tRowHeirarcy.TablixMembers.Add(rMem2)

    tablixRFoo.Style = New RdlObjectModel.Style With {.Border = New RdlObjectModel.Border}

    'add tablix to report
    tablixRFoo.TablixColumnHierarchy = tColHeirarcy
    tablixRFoo.TablixRowHierarchy = tRowHeirarcy

    rdlRpt.Body.ReportItems.Add(tablixRFoo)
于 2013-07-11T15:35:24.250 に答える