打印动态生成的复选框选中的行从datagridview到另一种形式的晶体报告c#

时间:2013-08-23 19:29:28

标签: c# winforms datagridview crystal-reports

我已经为datagridview(form1)中的每一行动态添加了复选框,我正在尝试在新表单(表单2)上生成水晶报表,仅针对那些选中了复选框的行。

我在form1按钮上的代码是

private void btn_Print_Click(object sender, EventArgs e)
{
//im trying to insert selected rows in datatable which is datasource for crystal report   
  DataTable table = new DataTable();
  int i = 1;
  foreach (DataGridViewRow row in dataGridView1.SelectedRows)
//dataGridView1.SelectedRows[0].Cells["select"].Value)
        {
            for (int j = 1; j < dataGridView1.ColumnCount; ++j)
            {
                table.Rows[i][j] = row.Cells[j].Value;
            }
            ++i;
        }
        if (cb_reptype.SelectedItem.ToString() == "Individual")
        {
    //here im specifying the path for new form2
          string path = table.ToString();//dataGridView1.SelectedRows[1].Cells["table"].Value.ToString();
            Form2 f2 = new Form2(path);
            //ReportDocument crystal = new ReportDocument();
            //crystal.Load(dataGridView1.SelectedRows[0].Cells["ReportPath"].Value.ToString());
            //pass = crystal;
            f2.Show();

        }

我在form2上的代码是

public partial class Form2 : Form
{
    public string source;
    public Form2(string path)
    {
        source = path;
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        this.crystalReportViewer1.ReportSource = source;
    }
}

在调试程序和按钮单击事件时,新表单正在打开,但它显示在下面错误。

我已经尝试过很多关于这个主题的研究,但没有达到标准。

请尽快回复..谢谢:)enter image description here

1 个答案:

答案 0 :(得分:0)

尝试在按钮单击事件内的Form构造函数中提供有效文档。 有效文档可以是.xml,.rpt文件,用于生成水晶报告。

对于当前场景,添加一些内容:

if (cb_reptype.SelectedItem.ToString() == "Individual")
{
  DataSet ds = new DataSet();
  ds.Tables.Add(table);
  ds.WriteXmlSchema("Drive:\\Somefolder\\Sample.xml"); // this generates Xml file.

现在将此路径传递给Form构造函数,因为这是有效的报告文件。

  Form f2 = new Form("Drive:\\Somefolder\\Sample.xml");
  f2.show();
}

在从datagrid添加任何值之前,您需要向DataTable添加行。

while(table.Rows.Count<dataGridView1.SelectedRows.Count)
{
  table.Rows.Add();
}

完成此操作后,您可以从datagrid添加值:

foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
  for (int j = 1; j < dataGridView1.ColumnCount; ++j)
  {
    table.Rows[i][j] = row.Cells[j].Value;
  }
  ++i;
}

希望它有效。