GridView+联接水晶报表
各位大虾,请帮个忙,我做了一个GridView显示一个表1中的数据,通过表1中的关键字GCRCLMLH,作为选择,通过水晶报表显示出表2和表3中的部门数据.其中表2和表3和表1都是通过关键字GCRCLMLH作为主外键的.可是现在我点选择,总是提示我水晶报表生成失败,不知是什么原因.
HTML
<asp:GridView ID="GridView1" OnPageIndexChanging="GridView1_PageIndexChanging"
runat="server" AutoGenerateColumns="False"
width="100%" EmptyDataText="没有符合查询条件的数据!" AllowPaging="True"
DataKeyNames="GCRCLMLH" onpageindexchanged="GridView1_PageIndexChanged"
onselectedindexchanging="GridView1_SelectedIndexChanging" >
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
<Report FileName="CG.rpt">
<DataSources>
<CR:DataSourceRef DataSourceID="SqlDataSource1" />
</DataSources>
<Parameters>
<CR:ControlParameter ControlID="GridView1" ConvertEmptyStringToNull="False"
DefaultValue="" Name="newParameter1" PropertyName="SelectedValue"
ReportName="" />
</Parameters>
</Report>
</CR:CrystalReportSource>
C#
private void ConfigureCrystalReports()
{
ReportDocument myReport;
String cn = @"Data Source=127.0.0.1;Initial Catalog=wcexxku;User ID=sa1;Password=sa";
SqlDataAdapter sqlAdapt = new SqlDataAdapter();
SqlConnection conn = new SqlConnection(cn);
string sqlStr = "select HTXMB.[GCRCLMLH],CLB.*,CLCGB.* from HTXMB INNER JOIN CLB ON HTXMB.GCRCLMLH = CLB.GCRCLMLH INNER JOIN CLCGB ON CLB.GCRCLMLH=CLCGB.GCRCLMLH WHERE HTXMB.[GCRCLMLH]= " + GridView1.SelectedDataKey.Value.ToString();
sqlAdapt = new SqlDataAdapter(sqlStr, conn);
DataSet1 dt1 = new DataSet1();
sqlAdapt.Fill(dt1, "myTable");
myReport = new ReportDocument();
myReport.Load(Server.MapPath("../CG.rpt"));
myReport.SetDataSource(dt1);
CrystalReportViewer1.ReportSource = myReport;}
[解决办法]
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
<%@ Register Assembly="CrystalDecisions.Web, Version=10.2.3600.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"
Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<link href="/aspnet_client/System_Web/2_0_50727/CrystalReportWebFormViewer3/css/default.css"
rel="stylesheet" type="text/css" />
<link href="/aspnet_client/System_Web/2_0_50727/CrystalReportWebFormViewer3/css/default.css"
rel="stylesheet" type="text/css" />
<link href="/aspnet_client/System_Web/2_0_50727/CrystalReportWebFormViewer3/css/default.css"
rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" OnSelectedIndexChanging="GridView1_SelectedIndexChanging" AllowPaging="True" AllowSorting="True" DataKeyNames="ID">
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT [ID], [Name], [Country] FROM [Customers]"></asp:SqlDataSource>
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" />
<br />
<br />
<br />
<br />
</div>
</form>
</body>
</html>
HTML部分
C#:
- C# code
using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;using CrystalDecisions.CrystalReports.Engine;using CrystalDecisions.Shared; public partial class Default3 : System.Web.UI.Page{ string sConnectionString; SqlConnection Conn; ReportDocument ocr; DataSet ds; string condition = ""; protected void Page_Load(object sender, EventArgs e) { } protected DataSet GetData() { sConnectionString = @" Data Source=HH-LIN\SQL2005;Initial Catalog=test;User ID=sa;Password=411325"; Conn = new SqlConnection(sConnectionString); Conn.Open(); SqlDataAdapter sda = new SqlDataAdapter("Select * From Uers1", Conn); ds = new DataSet(); sda.Fill(ds, "Uers1"); Conn.Close(); sda.Dispose(); return ds; } protected void PushAllDataToReport() { if (ds == null) { ds = GetData(); } ocr = new ReportDocument(); ocr.Load(Server.MapPath("~/CR4.rpt")); ocr.SetDataSource(ds.Tables[0]); } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { try { condition = "ID ="+GridView1.SelectedDataKey.Value.ToString();// } catch (System.Exception ex) { condition = ""; } if (condition != "") { if (ocr == null) { try { PushAllDataToReport(); #region 根据条件把筛选出来的行转换为DataTable也就是DataRow[]--->DataTable //(ID >= '10000' and ID <='10001') //ID between '10000' and '10002' 这个不行 DataRow[] dr = ds.Tables[0].Select(condition);//condition:获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。 DataTable dt = ds.Tables[0].Clone();//复制一个原表的结构,与DataRow字段与类型相同 for (int i = 0; i < dr.Length; i++) { dt.ImportRow(dr[i]); } #endregion ocr.SetDataSource(dt); } catch { } } } else { PushAllDataToReport(); ocr.Refresh(); } this.CrystalReportViewer1.ReportSource = ocr; this.CrystalReportViewer1.RefreshReport(); } protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e) { }}