C# 实现reportview的操作,详解。
https://blog.csdn.net/xufengab/article/details/123416231
一、vs2015中没有reportview组件,需要安装。
在VS中选择工具——Nuget包管理器——程序包管理器控制台
执行命令:Install-Package Microsoft.ReportingServices.ReportViewerControl.WinForms -Pre
然后在VS的工具——选择工具箱项——.NetFramework下,选择“浏览”,然后在工程根目录下的“\packages\Microsoft.ReportingServices.ReportViewerControl.Winforms.xx\lib\net40”目录下选择“Microsoft.ReportViewer.WinForms.dll”文件(其中xx代表Microsoft.ReportingServices.ReportViewerControl.Winforms.140.1000.523后面的数字)。
或者在VS的项目——管理NuGet程序包——浏览中搜索并安装
若添加后是15.0版本的,需要.net4.6才能编译成功。
二、若安装后仍有问题,需更新VS2015的安装。
勾选上以下三个选项,安装即可。
三、报表的使用步骤
添加数据集类(.xsd)
在数据集文件中添加DataTable,并编辑字段,Ctrl+l为添加字段的快捷键,字段默认string类型。
2. 添加报表类(.rdlc)
在报表文件中可添加文本框、矩阵、表,为他们绑定数据集里的字段。
文本框可通过传递参数的方式更新数据。
若在开发过程中发现在数据集里添加新的字段,而rdlc文件中没有显示的问题,那是因为rdlc文件不会根据数据集文件中的字段进行自动更新,需要手动更新。
把rdls文件以xml的方式打开
打开后,下拉到最后,可以删除添加字段,添加后rdlc文件中便可查看和选择了。
3. 在form窗体中添加reportview组件,单击右上角的小箭头,选择rdlc文件即可。
四、上代码:三种方式实现数据的传递与更新
//方式一:查询数据,把结果直接赋值给reportview
public void QueryData()
{
string MyConn = "server=" + serverIP + ";uid=" + userName + ";pwd=" + password
+ ";database=" + databaseName + ";Trusted_Connection=no";
SqlConnection MyConnection = new SqlConnection(MyConn);
string strSql = "select * from SJJRDCJ where 1=1";
SqlCommand MyCommand = new SqlCommand();
SqlDataReader mySqlDataReader;
DataSet MyDataSet = new DataSetNew();//把已创建好的数据源赋值给数据集变量
try
{
//打开连接并执行sql语句
MyConnection.Open();
MyCommand.CommandType = CommandType.Text;
MyCommand.Connection = MyConnection;
MyCommand.CommandText = strSql;
mySqlDataReader = MyCommand.ExecuteReader(); //执行sql语句,把读取的结果给SqlDataReader类的实例
//把读取来的数据加载到数据集中。
MyDataSet.Tables[0].Load(mySqlDataReader);
//关闭读取及其连接
mySqlDataReader.Close();
MyConnection.Close();
//为查看器提供本地报表数据
reportViewer1.LocalReport.ReportPath = "Report2.rdlc";//把Report2.rdlc 文件放在bin目录下。
reportViewer1.LocalReport.ReportEmbeddedResource = "Report2.rdlc";//获取或设置报表嵌入资源的名称
//准备报表数据源
ReportDataSource rds = new ReportDataSource();
rds.Name = "DataSetNew";//这个名字别错了
rds.Value = MyDataSet.Tables[0];
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.DataSources.Add(rds);//把数据源加载到reportview中去
reportViewer1.RefreshReport();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if(MyConnection.State == ConnectionState.Open)
{
MyConnection.Close();
}
}
}
//方式二:datatable 为数据源的方式。
private void UpdatePatientInfo()
{
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Sex", typeof(string));
dt.Columns.Add("Age", typeof(string));
dt.Columns.Add("KeShi", typeof(string));
dt.Columns.Add("CheckNum", typeof(string));
dt.Columns.Add("BedNum", typeof(string));
dt.Columns.Add("ZhuYuanNum", typeof(string));
dt.Columns.Add("Height", typeof(string));
DataRow row = dt.NewRow();
row[0] = "张一";
row[1] = "男";
row[2] = "23";
row[3] = "神经科";
row[4] = "1456432";
row[5] = "394";
row[6] = "93493494399";
row[7] = "168cm";
dt.Rows.Add(row);
reportViewer1.LocalReport.ReportPath = "Report2.rdlc";//把Report2.rdlc 文件放在bin目录下。
reportViewer1.LocalReport.ReportEmbeddedResource = "Report2.rdlc";//获取或设置报表嵌入资源的名称
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetNew", dt));//这里的DataSetNew数据集的名称,而不是xsd文件名。
reportViewer1.RefreshReport();
}
//方式三:通过设置参数的方式把值传给reportview,前提是依附于设定好数据源,也就是说必须先执行方法一或者方法二。
private void SetCanShu()
{
reportViewer1.ShowParameterPrompts = true;
ReportParameter titleName = new ReportParameter();
titleName.Name = "ReportParameter1";
titleName.Values.Add("标题");
ReportParameter danWeiName = new ReportParameter();
danWeiName.Name = "ReportParameter2";
danWeiName.Values.Add("单位名称");
reportViewer1.LocalReport.SetParameters(new ReportParameter[] {danWeiName,titleName });
reportViewer1.RefreshReport();
}