往往在报表中要用到多张表的多个字段(转)
往往在报表中要用到多张表的多个字段,如果在rpt文件里进行关联会感觉很烦而且到最后连自己都搞不清了。
1.建立一个dataset然后添加new Element(也就是定义表结构,一个或多个)
3.建立rpt文件,在ADO.NET数据源中选择刚刚建立的dataset。
4.建立.aspx文件 拖入报表控件。
5.采用push模式把数据动态添加进去
下边是详细的代码,用之前要倒入using System.Data.SqlClient呦
-----------------------------------------------------------------------------------------------
private void Form1_Load(object sender, System.EventArgs e)
{
Dataset1 myset = new Dataset1();
CrystalReport1 rpt= new CrystalReport1();
rpt.SetDataSource("");
string strCnn = "Server=.;Database=A;uid=sa; password=sa";
string strSql = "select * from A1,A2";
string strSql1 = "select * from B1,B2";
SqlConnection conn = new SqlConnection(strCnn);
try
{
SqlDataAdapter dataadpter = new SqlDataAdapter(strSql,strCnn);
SqlDataAdapter dataadpter1 = new SqlDataAdapter(strSql1,strCnn);
conn.Open();
SqlCommand cmd = new SqlCommand(strSql,conn);
SqlDataReader sqlreader = cmd.ExecuteReader();
if(sqlreader!=null)
{
while(sqlreader.Read())
{
//test是在dataset里定义的表结构名,test1,test2是表的2个字段
DataRow dr = myset.Tables["test"].NewRow();
dr["test1"] = sqlreader[0];
dr["test2"] = sqlreader[1];
myset.Tables["test"].Rows.Add(dr);
}
sqlreader.Close();
}
SqlCommand cmd1 = new SqlCommand(strSql1,conn);
SqlDataReader sqlreader1 = cmd1.ExecuteReader();
while(sqlreader1.Read())
{
//fxb是在dataset里定义的表结构名,f1和f2是表的2个字段
DataRow dr1 = myset.Tables["fxb"].NewRow();
dr1["f1"] = sqlreader1[0];
dr1["f2"] = sqlreader1[1];
myset.Tables["fxb"].Rows.Add(dr1);
}
sqlreader1.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
finally
{
if(conn!=null)
{
conn.Close();
}
}
rpt.SetDataSource(myset);
crystalReportViewer1.ReportSource = rpt;
}
DataSet myds=new DataSet();
SqlDataAdapter myadapter=new SqlDataAdapter("select * from table1",myconn);
SqlDataAdapter myadapter2=new SqlDataAdapter("select * from table2",myconn);
myadapter.Fill(myds,"table1");
myadapter2.Fill(myds,"table2");
CrystalReport1 rpt=new CrystalReport1();
rpt.SetDataSource(myds);