传递参数 - ReportViewer本地模式

时间:2011-01-24 05:04:37

标签: c# sql reporting-services reportviewer

使用VS2010中的ReportViewer控件传递本地报表中的参数。用户点击商家,然后按下按钮(未显示),然后呈现报告。

我尝试过使用此视频:How-to Pass Parameter to Report Viewer - YouTube

问题:代码不起作用 - 在底部的xxxx附近我无法弄清楚应该在那里的内容

问题:我很想摆脱这段代码并使用linqtosql或更简单的东西。

alt text

protected void Page_Load(object sender, EventArgs e)
    {
        DataSet1TableAdapters.MerchantNamesTableAdapter merchantNamesTableAdapter = new DataSet1TableAdapters.MerchantNamesTableAdapter();
        ddlMerchants.DataSource = merchantNamesTableAdapter.GetDataAllMerchants();
        ddlMerchants.DataTextField = "Name";
        ddlMerchants.DataValueField = "MerchantUID";
        ddlMerchants.DataBind();
        ReportViewer1.Visible = false;
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ReportViewer1.Visible = true;
        var newDataSet = new DataSet();

        SqlConnection sqlConnection = new SqlConnection("Data Source=.;Initial Catalog=myDataBase;Integrated Security=True");
        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
        SqlCommand sqlCommand = new SqlCommand();
        sqlCommand.Connection = sqlConnection;
        sqlCommand.CommandType = CommandType.Text;
        sqlCommand.CommandText = "select * from merchant where merchantUID = @MerchantUID";
        sqlCommand.Parameters.AddWithValue("@MerchantUID", ddlMerchants.SelectedValue);
        sqlDataAdapter.SelectCommand = sqlCommand;
        sqlDataAdapter.Fill(newDataSet);

        ReportDataSource datasource = new ReportDataSource(xxxx, newDataSet.Tables(0));

        ReportViewer1.LocalReport.DataSources.Clear();
        ReportViewer1.LocalReport.DataSources.Add(datasource);
        ReportViewer1.LocalReport.Refresh();
    }

4 个答案:

答案 0 :(得分:2)

在这样的场景中,我通常会遵循这条道路:

  • 我为报告创建了一个数据集:选择报告和菜单命令View - Report Data;在Report Data窗口中选择New ... - Dataset。我输入数据集的名称(假设Redemptions),我选择New ... next by DataSource,然后我选择Object,然后导航到我的域(或dto)类。完成后我看到了我班上的字段,我可以在报告中使用它;

  • 如果需要,我在报告数据窗口中创建参数(右键单击参数节点)并定义参数的名称和类型;

  • 我编写此代码以将数据和参数(如果需要)传递给报告:

    viewer.Reset();
    ReportDataSource dataSource = new ReportDataSource();
    // I use a service/repository; you could also use Linq2Sql or EntityFramework 
    IList<Redemption> redemptions = _service.GetRedemptions(merchantId);
    BindingSource bindingSource = new BindingSource(redemptions, string.Empty);
    dataSource.Name = "Redemptions";
    dataSource.Value = bindingSource;
    viewer.LocalReport.DataSources.Add(getDataSource(sourceInfo));
    String reportName = "AD.Conso.MyReport.rdlc";
    viewer.LocalReport.ReportEmbeddedResource = reportName;
    
    IList<ReportParameter> parameters = new List<ReportParameter>();
    parameters.Add(new ReportParameter("myParameterName", "myParameterValue"));
    viewer.LocalReport.SetParameters(parameters);
    viewer.RefreshReport();
    
  • 注意:我从一个项目中获取此代码,我在稍微不同的上下文中使用它,因此在您的上下文中可能不需要某些代码。

答案 1 :(得分:1)

xxxx只是您想拥有的数据源的名称。它可以是任何东西,并由构造函数用于Construct命名数据源。它只是一个标识符。就像通过“Merchent_Redemptions”或任何你喜欢的那样。

答案 2 :(得分:0)

数据表被用作构造函数,而不应该写为索引..

以下是代码 ReportDataSource datasource = new ReportDataSource(xxxx,newDataSet.Tables(0));

代码应采用此格式 ReportDataSource datasource = new ReportDataSource(xxxx,newDataSet.Tables [0]);

答案 3 :(得分:0)

如果你有dataAdapator,那么DataSet会在表单加载时尝试这个: -

    this.DataTableAdapter.Fill(this.myDatabase_DataSet.tableName, parameter01, parameter02);
    this.reportViewer1.RefreshReport();