[RDLC]心得整理(一)
2014年在做項目的時候, 過用過RDLC, 之後便在沒有使用過了. 最近又有項目使用rdlc, 感覺有些陌生,然後重新閱讀了以前的筆記,想做一下整理.
常見問題:
1. 為什麽rdlc報表出來的pdf, 最後面有一頁空白頁?
2.有2個或多個數據源, 怎麽樣設置和綁定?
3.有一個表格, 裏面還有一個表格, 如何做排版,使上下表格排版各自獨立.
一.為什麽rdlc報表出來的pdf, 最後面有一頁空白頁?
有的時候, 並不是下面的長度問題, 而是寬度問題, 右鍵=>視圖=>標尺 寬度不超過16,基本A4 不會有空白頁.
二.有2個或多個數據源,怎麽設置綁定.
我們知道, 新建一個rdlc,裏面拖入一張表,會要求創建一個數據源, 然後再拖入第二章表...誒,發現沒有創建數據源選項,
有一種是先建數據源,一個字段一個字段的添加, 然後再去綁定, 我覺得這樣做特別麻煩, 因為字段很多,改起來也是相當麻煩.
經過研究, 個人認為以下方式, 比較快速,而且也方便.
步驟1.首先在BLL業務邏輯層, 建好對應的 一個 返回List<T>的沒有邏輯主體的方法
public List<Student>GetStudentList(){ return new List<Student>();};
public List<Teacher>GetStudentList(){ return new List<Teacher>();};
步驟2. 在解決方案目錄下, 選擇rdlc,右鍵=>打開方式=>xml(文本)編輯器打開
可以看到有 <DataSources>節點 和 <DataSets> 節點,這兩個是 一一對應的.
假設我現在有 2個數據源 <DataSource Name="DataSource1"> <DataSource Name="DataSource2"> 和 <DataSet Name="DataSet1">, <DataSet Name="DataSet2">
DataSource 結構說明: 設置一個Name和 DataSourceID (必須唯一)
<DataSource Name="DataSource1"> <ConnectionProperties> <DataProvider>System.Data.DataSet</DataProvider> <ConnectString>/* Local Connection */</ConnectString> </ConnectionProperties> <rd:DataSourceID>f967ab1f-060c-4fd6-b670-a2ffbf328f9c</rd:DataSourceID> </DataSource>
DataSet 結構說明: <Query> 裏面設置的 <DataSourceName>就是 數據源 ,對應上面的 <DataSource>, 然後下面是 <Fields> 字段列表.
<Fields>節點裏面是數據源的字段列表, 字段名, 數據類型. 最後面有一個 <rd:DataSetInfo>,著重說一下這個
<rd:DataSetName>是 上面所定義的方法的類所在的命名空間.
<rd:TableName>RdlcDataSource</rd:TableName>是類的名稱, 我這裏專門建一個類, 用於存放rdlc的數據源
<rd:ObjectDataSourceSelectMethod> 是方法的名稱 , 例如返回List<T> 的方法名
<rd:ObjectDataSourceSelectMethodSignature> 這個是 對返回List<T>的方法, T 的解釋 ,如下表示 是一個List, T的類型是 PdfLibrary.Models.Cfxx (命名空間.類名), 方法名是 GetCfxxList
==> System.Collections.Generic.List`1[PdfLibrary.Models.Cfxx] GetCfxxList(System.Collections.Generic.List`1[PdfLibrary.Models.Cfxx])
<rd:ObjectDataSourceType> 對"類" 對象的說明; 該類是 PdfLibrary.dll下, 類的全名稱是 PdfLibrary.CreatePdfTemp.RdlcDataSource
==> PdfLibrary.CreatePdfTemp.RdlcDataSource, PdfLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
<DataSet Name="DataSet1"> <Query> <DataSourceName>DataSource1</DataSourceName> <CommandText>/* Local Query */</CommandText> </Query> <Fields> <Field Name="cfbm"> <DataField>cfbm</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Fields> <rd:DataSetInfo> <rd:DataSetName>PdfLibrary.CreatePdfTemp</rd:DataSetName> <rd:TableName>RdlcDataSource</rd:TableName> <rd:ObjectDataSourceSelectMethod>GetCfxxList</rd:ObjectDataSourceSelectMethod> <rd:ObjectDataSourceSelectMethodSignature>System.Collections.Generic.List`1[PdfLibrary.Models.Cfxx] GetCfxxList(System.Collections.Generic.List`1[PdfLibrary.Models.Cfxx])</rd:ObjectDataSourceSelectMethodSignature> <rd:ObjectDataSourceType>PdfLibrary.CreatePdfTemp.RdlcDataSource, PdfLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</rd:ObjectDataSourceType> </rd:DataSetInfo>
綁定列表:
<DataSources> 的第一個節點, 最好設置成,用來綁定 表格的. , 後面可以直接使用 <Value>=Fields!cfbm.Value</Value> 來綁定字段,
這裏的 Fields 默認指的就是 第一個數據源DataSet1 裏面的字段.
綁定文本字段:
如果單獨綁定某一個文本框 <Value>=First(Fields!cfbm.Value, "DataSet1")</Value> ,
如果要用到 第二個數據源, 綁定某一個文本框, 要這樣使用, 指定 <Value>=First(Fields!cfxx_sjfw.Value, "DataSet2")</Value>
備註說明:
一個 表 對象, 裏面只能設置一個數據源, 如果有不同的數據源, 需要拆分出來, 單獨創建一個表,單獨選擇 DataSetName
小技巧:
當有多個數據源的時候, 新建一個空白的 rdlc,然後 放一張 表, 會選擇數據源, 然後將這個裏面的 dataset 裏面的配置, 拷貝過去,更改 datasource 就行了.
[RDLC]心得整理(一)