C# - 在运行时更新Crystal Report

时间:2015-01-25 20:06:41

标签: c# .net crystal-reports

我尝试解决问题,但我仍然没有成功。

我在Win 8.1,VS2013社区工作。

我有简单的Winform应用程序,包含DatagridView和Button。 Datagridview有一列,在表单的构造函数中填充了样本值。

        private List<StringValue> list;
    private List<Report> lr;
    public Form1()
    {
        InitializeComponent();
        list = new List<StringValue>();
        lr = new List<Report>(); 
        list.Add(new StringValue("bla1"));
        list.Add(new StringValue("bla2"));
        dataGridView1.DataSource = list;
    }

作为项目的一部分,我还有数据集组件,在按钮点击后填充。并为datagridview的每一行创建水晶报告及其名称并添加到列表中。

        private void button1_Click(object sender, EventArgs e)
    {
        int i = 1;
        ReportDocument cr;
        try
        {
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {

            cr = new CrystalReport1();
            dataSet11.DataTable1.Rows.Clear();
            cr.SetDataSource(dataSet11);
            DataRow nr = dataSet11.DataTable1.NewRow();
            nr["sloup1"] = row.Cells["sloup1"].Value;
            dataSet11.DataTable1.Rows.Add(nr);
            cr = new CrystalReport1();
            cr.SetDataSource(dataSet11);
            cr.Refresh();
            lr.Add(new Report(i.ToString(), cr));
            i++;
        }

            ReportViewer viewer = new ReportViewer(lr);
            viewer.Show();

        }
        catch (Exception ex)
        { }
    }
}

报告类

public class Report
{
    private  string m_name = null;
    private CrystalDecisions.CrystalReports.Engine.ReportDocument m_document;
    public string Name 
    { 
        get{return m_name;}
        set{m_name = value;}
    }
    public ReportDocument reportDocument 
    {
        get { return m_document; }
        set { m_document = value; }
    }

    public Report(string name, ReportDocument doc)
    {
        m_name = name;
        m_document = doc;
    }
}

我还使用listBox创建了其他表单,其中显示了报表和crystalreportviewer控件的名称。单击列表框中的项目后,我想打开从form1发送的crystalreport。这是源代码:

List<Report> lr = null;
    public ReportViewer()
    {
        InitializeComponent();
    }

    public ReportViewer(List<Report> reports) : this()
    {
        lr = reports;
        foreach (Report report in reports)
        {
            listBox1.Items.Add(report.Name);
        }
        listBox1.SelectedIndex = 0;
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        crView.ReportSource = null;
        ReportDocument rep = new ReportDocument();
        rep = GetReport(listBox1.SelectedIndex);
        crView.ReportSource = rep;
        this.crView.RefreshReport();

    }

    private ReportDocument GetReport(int p)
    {
        return lr[p].reportDocument;
    }
}

现在出现了什么问题:当我点击列表框中的项目时,在查看器中仅显示上一个报告。有两个名称不同的项目,但是只有一个报告。 如果我尝试在form1上为每个创建的报告显示报告,则值和报告都可以,但在selectedindexchanged事件中,两个reportdocument都是相同的。 请问哪里有错误? 如何更新crzstal报告,以便显示正确的数据?

提前感谢。

0 个答案:

没有答案