VS2005下水晶報表如何實現動態數據源綁定

 之前在論壇中經常有人問起在VS2005中使用水晶報表(Crystal Report 10)如何用DataSet實現動態的數據源綁定?關於這個問題我研究了一下,找到了新的解決方案。
在以前VS2003中可以採用PUSH模式推報表,可以用如下的代碼實現:
con = new SqlConnection(Session["SQLCONNECTION"].ToString());
strSql = "SELECT * FROM htOrder";
scm = new SqlCommand(strSql, con);
sda = new SqlDataAdapter(scm);
ds = new DataSet();
sda.Fill(ds, " order ");
rptOrder.SetDataSource(ds.Tables["order"]);
crOrder.ReportSource = rptOrder;



在VS2005中不再支持“embedded report”嵌入式報表,只能採用非嵌入式報表的方法拉數據,下面是典型的代碼:

//綁定報表數據
private void BindCrystalReports()
{
string path1 = Server.MapPath("~//Report//");
string path2 = path1 + "repOrder.rpt";
ReportDocument repDoc = new ReportDocument();
repDoc.Load(path2);
SetDBLogonForReport(repDoc); //設置數據登錄信息
crOrder.ReportSource = repDoc;
string selectionFormula = "{htOrder.htID} =" + txtHtID.Text.Trim();//設置報表數據篩選公式
repDoc.DataDefinition.RecordSelectionFormula = selectFormula;
crOrder. DataBind ();
}
//設置登錄信息
private void SetDBLogonForReport(ReportDocument reportDocument)
{
try
{
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.ServerName = ConfigurationManager.AppSettings["ServerName"];
connectionInfo.DatabaseName = ConfigurationManager.AppSettings["DatabaseName"];
connectionInfo.UserID = ConfigurationManager.AppSettings["UserID"];
connectionInfo.Password = ConfigurationManager.AppSettings["Password"];
Tables tables = reportDocument.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
TableLogOnInfo tableLogonInfo = table.LogOnInfo;
tableLogonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogonInfo);
}
}
catch
{
lblNote.Text = "<script>alert('數據庫登錄信息不正確!');</script>";
}
}


這種方式是不是太頻繁瑣了,在數據結構更改或者查詢條件發生變化時必須要再次更改報表設置,那麼在VS2005中水晶報表有沒有更簡潔的方法呢?最好不用寫代碼就能搞定呢?有,那就是新的數據綁定控件CrystalReportSource,這個控件與SqlDataSource數據源綁定控件一起連用就可以用SQL表達式作數據源推數據了。下面是實現的步驟:

1. 建立水晶報表,注意報表要用OLE DB ADO方式連接數據源,這樣可以省去報表登錄窗口的彈出。
2. 在設計視圖中拖拉報表控件CrystalReportViewer,點擊右上角智能標籤設置報表數據源,選擇報表文件,自動生成CrystalReportSource,這時在設計視圖中將顯示出報表界面,水晶報表將自動用初始數據填充報表字段。注意這裏有個小Bug,如果報表在子目錄中,選擇報表文件將自動用相對路徑表示,這時報表顯示會出錯,應改成絕對路徑纔可以。
<Report FileName="report/rptOrder.rpt">這裏應改成:<Report FileName="../report/rptOrder.rpt">
3.拖拉一個數據源控件SqlDataSource(也可以用ObjectDataSource),按嚮導生成數據源,這裏可以篩選數據,根據情況選擇各類數據源。
4.如何將CrystalReportSource與SqlDataSource兩個控件連接在一起呢?可以這樣:選擇CrystalReportSource控件點擊右側屬性中數據欄,再點擊Report選擇DataSource,在這個數據源集合編輯器選擇數據源指定報表名稱即可。(下面的Parameters是用來選擇報表參數用的)

經過這幾個步驟,就可以運行程序顯示報表啦,怎麼樣不用寫一句代碼吧?

具體代碼可參考如下:

<CR:CrystalReportViewer ID="crOrder" runat="server" AutoDataBind="True" ReportSourceID="ReportSourceOrder" BestFitPage="False" DisplayToolbar="False" DisplayGroupTree="False" Height="1042px" Width="775px" EnableParameterPrompt="False" />
<CR:CrystalReportSource ID="ReportSourceOrder" runat="server">
<Report FileName="../report/rptOrder.rpt">
<DataSources>
<CR:DataSourceRef DataSourceID="SqlDataSourceOrder" TableName="htOrder" />
</DataSources>
</Report>
</CR:CrystalReportSource>
<asp:SqlDataSource ID="SqlDataSourceOrder" runat="server" ConnectionString="<% ConnectionStrings:cc_2005 %>"
SelectCommand="SELECT * FROM [htOrder] "></asp:SqlDataSource>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章