首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

GridView+联接水晶报表解决办法

2013-01-26 
GridView+联接水晶报表各位大虾,请帮个忙,我做了一个GridView显示一个表1中的数据,通过表1中的关键字GCRCL

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#:


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)
    {
    }
}




热点排行