rdlc 报表字符类数据分为文本数据和表数据,区别就在于文本数据只有一个,表数据可以有多行,然而有很多数据只需要一个传入就可以比如打印某个用户的基本信息,很多信息都是唯一的,如果此时报表传入的数据用可视化的dataset的话,有些浪费资源,在这里就可以先设置 报表属性的 ReportParameters,然后在对应的浏览报表的代码里面添加
List<Microsoft.Reporting.WinForms.ReportParameter> list=new List<Microsoft.Reporting.WinForms.ReportParameter>(); foreach (DataColumn i in dataRow_val.Table.Columns) list.Add(new Microsoft.Reporting.WinForms.ReportParameter(i.ColumnName, dataRow_val[i.ColumnName].ToString())); this.reportViewer1.LocalReport.SetParameters(list); this.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout); this.reportViewer1.RefreshReport();
当然在上诉datarow对应的datatable的columnname和ReportParameters的设置要相同,传入数据,OK
再说说动态传入dataset,rdlc的表控件对应的数据源为dataset,然而用视图话的dataset很大的不方便,一直没有发现在视图编辑器里面怎么设置报表的dataset,没发现怎么和ReportParameters一样设置参数式的设置dataset,但是rdlc是可编辑的xml文件,可以手动的添加dataset的代码,主要键为 <DataSets> <DataSet Name=""> <Fields> <Field Name=""> <DataField></DataField> <rd:TypeName>System.String</rd:TypeName>可以手动设计好dataset
<DataSources> <DataSource Name="DummyDataSource"> <rd:DataSourceID>9a23267d-5f31-4a2c-85dd-260357bc99f9</rd:DataSourceID> <ConnectionProperties> <DataProvider>SQL</DataProvider> <ConnectString /> </ConnectionProperties> </DataSource> </DataSources> <DataSets> <DataSet Name="ds_THJL"> <Fields> <Field Name="工号"> <DataField>工号</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="员工姓名"> <DataField>员工姓名</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="姓名"> <DataField>姓名</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="性别"> <DataField>性别</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="客户名称"> <DataField>客户名称</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="个人电话"> <DataField>个人电话</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="通道"> <DataField>通道</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="录音时长"> <DataField>录音时长</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="通话类型"> <DataField>通话类型</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="通话时间"> <DataField>通话时间</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> </Fields> <Query> <DataSourceName>DummyDataSource</DataSourceName> <CommandText /> <rd:UseGenericDesigner>true</rd:UseGenericDesigner> </Query> <rd:DataSetInfo> <rd:DataSetName>ds_THJL</rd:DataSetName> <rd:TableName>dt_THJL</rd:TableName> </rd:DataSetInfo> </DataSet> </DataSets> <DataSources> <DataSource Name="DummyDataSource"> <rd:DataSourceID>9a23267d-5f31-4a2c-85dd-260357bc99f9</rd:DataSourceID> <ConnectionProperties> <DataProvider>SQL</DataProvider> <ConnectString /> </ConnectionProperties> </DataSource> </DataSources> <DataSets> <DataSet Name="ds_THJL"> <Fields> <Field Name="工号"> <DataField>工号</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="员工姓名"> <DataField>员工姓名</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="姓名"> <DataField>姓名</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="性别"> <DataField>性别</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="客户名称"> <DataField>客户名称</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="个人电话"> <DataField>个人电话</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="通道"> <DataField>通道</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="录音时长"> <DataField>录音时长</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="通话类型"> <DataField>通话类型</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="通话时间"> <DataField>通话时间</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> </Fields> <Query> <DataSourceName>DummyDataSource</DataSourceName> <CommandText /> <rd:UseGenericDesigner>true</rd:UseGenericDesigner> </Query> <rd:DataSetInfo> <rd:DataSetName>ds_THJL</rd:DataSetName> <rd:TableName>dt_THJL</rd:TableName> </rd:DataSetInfo> </DataSet> </DataSets>
然后在设置
if (dataGridView1.Rows.Count > 0) { DataSet ds_THJL = new DataSet("ds_THJL"); DataTable dt = new DataTable(); ds_THJL.Tables.Add(dt); dt.Columns.Add("工号"); dt.Columns.Add("员工姓名"); dt.Columns.Add("姓名"); dt.Columns.Add("性别"); dt.Columns.Add("客户名称"); dt.Columns.Add("个人电话"); dt.Columns.Add("通道"); dt.Columns.Add("录音时长"); dt.Columns.Add("通话类型"); dt.Columns.Add("通话时间"); dt.TableName = "dt_THJL"; foreach (DataRow dr in Dataset.Tables[0].Select(Dataset.Tables[0].DefaultView.RowFilter)) { DataRow ddrr = dt.NewRow(); ddrr["工号"] = dr["工号"]; ddrr["员工姓名"] = dr["员工姓名"]; ddrr["姓名"] = dr["姓名"]; ddrr["性别"] = dr["性别"]; ddrr["客户名称"] = dr["客户名称"]; ddrr["个人电话"] = dr["个人电话"]; ddrr["通道"] = dr["通道"]; ddrr["录音时长"] = dr["录音时长/秒"]; ddrr["通话类型"] = dr["通话类型"]; ddrr["通话时间"] = dr["通话时间"]; dt.Rows.Add(ddrr); } frmRptTh frmrptTh = new frmRptTh(dt); frmrptTh.ShowDialog(); }
this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ds_THJL", dataTable)); this.reportViewer1.SetDisplayMode(DisplayMode.PrintLayout); this.reportViewer1.RefreshReport();
一切都看得到,发生错误也很好调整,用视图模式的方便性及错误的调试都不如这样好