程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 使用ASP.NET 2.0中的ReportViewer控件

使用ASP.NET 2.0中的ReportViewer控件

編輯:.NET實例教程
本文翻譯:webabcd

  介紹

  任何數據驅動型的應用程序都有一個普遍的需求,那就是報表。 但是,在ASP.NET 1.x中並沒有給我們提供這個非常重要的特性。 然而很幸運的是,伴隨著.Net 2.0而來的ReportViewer控件可以滿足你對報表的一些基本需求。 我將會在本文中向你演示如何使用這個控件。 ReportVIEwer控件既可以在web程序中使用,也可以在Windows程序中使用。 在這裡,我將只介紹如何在web程序中使用它。

  報表示例

  我們假設要生成一個如下所示的顧客信息列表:

  

  上面的報表是一個非常簡單的以國家分組的顧客信息列表。 報表的數據是從Northwind數據庫的Customers表裡獲取的。 默認情況下,它會顯示所有的顧客信息。 但是,你也可以讓它顯示屬於你指定的某個國家的顧客信息。

  該報表是使用ReportVIEwer控件設計的,它可以從強類型的DataSet中或者自定義的對象集合中獲取數據。 在實際的程序開發中,我們往往會使用3層架構,數據的獲取經常會是從業務層取得的DataSet或一個泛型集合。 在這裡,我打算使用一個泛型集合作為數據源,而不是強類型的DataSet。

  創建類庫

  首先,打開Visual Studio,然後創建一個名為ReportVIEwerLib的類庫項目。 添加一個如下所示的名為Customer的類:

using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClIEnt;
using System.Collections.Generic; 
namespace ReportVIEwerLib
{
 public class Customer
 {
  public string strCustomerID;
  public string strCompanyName;
  public string strContactName;
  public string strCountry;

  public string CustomerID
  {
   get
   {
    return strCustomerID;
   }
   set
   {
    strCustomerID = value;
   }
  }

  public string CompanyName
  {
   get
   {
    return strCompanyName;
   }
   set
   {
    strCompanyName= value;
   }
  }

  public string ContactName
  {
   get
   {
    return strContactName;
   }
   set
   {
    strContactName= value;
   }
  }

  public string Country
  {
   get
   {
    return strCountry;
   }
   set
   {
    strCountry= value;
   }
  }

  public static List GetCustomersForCountry(string country)
  {
   SqlConnection cnn=new SqlConnection(
    ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);
   SqlCommand cmd=new SqlCommand();
   cmd.Connection=cnn;
   cmd.CommandText="select 
   CustomerID,CompanyName,ContactName,Country 
from customers where country=@country";
   SqlParameter p=new SqlParameter
("@country",country);
   cmd.Parameters.Add(p);
   cnn.Open();
   SqlDataReader reader = cmd.ExecuteReader();
   List list = new List();
   while (reader.Read())
   {
    Customer c = new Customer();
    c.CustomerID = reader.GetString(0);
    c.CompanyName = reader.GetString(1);
    c.ContactName = reader.GetString(2);
    c.Country = reader.GetString(3);
    list.Add(c);
   }
   cnn.Close();
   return list;
  }

  public static List GetAllCustomers()
  {
   SqlConnection cnn = new SqlConnection(
    ConfigurationManager.ConnectionStrings
    ["NorthwindConnectionString"].ConnectionString);
   SqlCommand cmd = new SqlCommand();
   cmd.Connection = cnn;
   cmd.CommandText = "select 
   CustomerID,CompanyName,ContactName,Country from customers";
   cnn.Open();
   SqlDataReader reader = cmd.ExecuteReader();
   List list = new List();
   while (reader.Read())
   {
    Customer c = new Customer();
    c.CustomerID = reader.GetString(0);
    c.CompanyName = reader.GetString(1);
    c.ContactName = reader.GetString(2);
    c.Country = reader.GetString(3);
    list.Add(c);
   }
   cnn.Close();
   return list;
  }

 }
}

  Customer類定義了四個公共屬性,即CustomerID、CompanyName、ContactName和Country。 在之後,是這個類包含的兩個靜態方法 – GetCustomersForContry()和GetAllCustomers()。 這兩個方法都是比較簡單的,一個是返回屬於某一個國家的所有顧客信息,另一個是返回全部顧客信息。 首先打開Northwind數據庫的連接,然後通過SqlCommand對象執行SELECT查詢。 之後,用SqlDataReader對象來獲取數據。 遍歷這個SqlDataReader對象,在其內每次都創建一個Customer對象,然後設置它的各個屬性,最後把其添加到Customer對象的泛型集合中。 在類的結尾處就是把這個Customer對象的泛型集合返回給調用者。
  創建數據源

  設計報表的時候,需要在你的項目中為其指定一個數據源。 在你的項目中添加一個數據源可以這樣做,選擇“數據”菜單 -> 添加新數據源。 然後將會出現如下圖所示的對話框:

  

  你的數據源可以是數據庫、web service或者是一個對象。 本例中我們選擇的是對象。 然後單擊“下一步”按鈕,會彈出讓我們選擇數據源的界面。 我們選擇的是Customer類(如下圖所示)。

  

  單擊“完成”按鈕後就完成了數據源配置向導。 這樣,你就在你的類庫中添加了一個新的數據源。 如果要查看數據源的話可以這麼做,選擇“數據”菜單 -> 顯示數據源,就會出現如下圖所示的界面:

  

  設計報表

  接下來添加一個報表。 右鍵單擊項目,選擇“添加新項”。 在對話框裡選擇“報表”,並單擊“添加”按鈕(如下圖所示)。 這樣,我們就添加了一個名為“Report1.rdlc”的文件。 .rdlc文件是一個報表文件,它保存的是報表布局和數據映射。

  

  一旦你打開了Report1.rdlc文件,Visual Studio的工具箱裡就會顯示出一套與報表相關的控件(如下所示)。

  

  這些控件中,“文本框”控件和“表”控件是非常常用的。 “文本框”控件用於顯示一段靜態文本或者是一個表達式。 “表”控件用於顯示表格數據,其生成的結果會顯示在你的報表的“主體”中。

  設計出的報表如下圖所示:

  

  在報表的“頁眉”部分的頭部,有一個文本框,其Value屬性的值為“Customer Listing”。 在這個文本框的下面還有另一個文本框,其Value屬性的值為“=Parameters!SubTitle.Value”。它的意思就是指明文本框的值來自名為SubTitle的參數。 我們如何來定義參數呢? 這需要在報表的ReportParameters屬性中添加參數。 打開的報表參數對話框如下圖所示:

  

  請注意:參數的設置是在我們的.Net代碼中完成的。

  如果要在報表上顯示日期的話,只要設置相關的文本框的Value屬性為“=FormatDateTime(ToDay(),DateFormat.ShortDate)”即可。 報表的一大優勢就是有很多的內置函數,如ToDay()和FormatDateTime之類的。 本例中,我們使用FormatDateTime()函數來以ShortDate的格式顯示當前的日期(ToDay())。

  現在,從工具箱裡拖拽一個“表”控件到你的報表上。 默認情況下,“表”控件有3行3列,3行分別是:表頭、詳細信息和表尾。 當然,你也可以為“表”控件添加行和列。 從數據源窗口中拖拽CustomerID、CompanyName、ContactName和Country屬性到你的“表”控件的詳細信息行上。 這樣,系統將會自動地添加文本框,並設置其屬性為=Fields!CustomerID.Value、=FIElds!CompanyName.Value之類的。 此時,列頭也會被自動地添加。 當然,你也可以根據你的需求做你需要的修改。

  接下來,我們要按顧客所屬的國家對記錄進行分組。 右鍵單擊詳細信息行的邊框,選擇插入組(如下圖所示)。

  

  然後將會出現如下圖所示的對話框:

  

  在“排序”選項卡中選擇“=FIElds!Country.Value”作為表達式,選擇“Ascending”作為排序方向。

  就是這些東西,很簡單吧。 這樣,我們就完成了報表的設計。
  顯示報表

  新建一個名為“ReportViewerDemo”的web站點。 添加ReportViewerLib程序集的引用,這樣該程序集就會拷貝到你的web站點的BIN目錄下。 之後,把Report1.rdlc文件添加到你的web站點中。 在工具箱的“數據”選項卡中拖拽一個ReportVIEwer控件到你的Default.ASPx頁上, 打開ReportVIEwer控件的智能標記面板,在“選擇報表”的下拉框中選擇Report1.rdlc,如下圖所示:

  

  選擇好報表文件後,系統會自動地添加一個TypeName屬性為Customer的對象數據源控件。 你可以在對象數據源控件的配置向導中驗證一下。

  接下來,拖拽一個DropDownList控件到頁的頭部,並為其設置4個選項 – All、USA、UK和Brazil。 同時設置它的AutoPostBack屬性為True。 然後,打開數據源控件的配置向導,設置“SELECT”操作為SelectCustomersForCountry()方法。

  

  設置SelectCustomersForCountry()方法的country參數為DropDownList1的SelectedValue。

  

  默認情況下,將在報表中顯示所有顧客信息。 當你在DropDownList選擇了一個國家的時候,報表中就會顯示屬於你所選擇的國家的顧客信息。 要完成這樣的功能,我們只需要處理DropDownList的SelectedIndExchanged事件。

protected void DropDownList1_SelectedIndExchanged
(object sender, EventArgs e)

 if (DropDownList1.SelectedValue == "All")
 {
  ObjectDataSource1.SelectMethod = "GetAllCustomers";
  ObjectDataSource1.SelectParameters.Clear();
  ReportParameter param = new ReportParameter
("SubTitle", "List of all the customers");
  ReportParameter[] p ={ param };
  ReportVIEwer1.LocalReport.SetParameters(p);
 }
 else
 {
  ObjectDataSource1.SelectMethod = "GetCustomersForCountry";
  ObjectDataSource1.SelectParameters[0].DefaultValue 
= DropDownList1.SelectedValue;

  ReportParameter param = new ReportParameter
("SubTitle", "List of customers for a country");
  ReportParameter[] p ={ param };
  ReportVIEwer1.LocalReport.SetParameters(p);
 }
}
  這段代碼首先檢查DropDownList控件的SelectedValue屬性。 如果是“All”的話就設置數據源控件的SelectMethod屬性為GetAllCustomers。 另外,我們還需要清空SelectParameters集合,因為GetAllCustomers()方法不需要任何參數。 接下來,我們創建一個ReportParameter類的實例,並在其構造函數中設置報表的參數名和參數值。 回憶一下我們在設計報表時定義的參數。 然後再創建一個ReportParameter數組。 調用SetParameters()方法,並用這個數組作為其參數。 “else”代碼塊也是非常地簡單,就是使用的方法變成了GetCustomersForCountry()而已。

  就是這些東西,很簡單吧。 報表已經搞定了。 你可以運行一下Default.ASPx頁看看效果。 注意,ReportVIEwer控件已經內置了導出特性,它允許你把報表導出為Excel或PDF格式。 ReportVIEwer控件還很多的屬性,你可以自己摸索一下。

  總結

  ASP.Net的ReportViewer控件提供了很多報表的基本功能。 在本文中,我們使用了對象數據源控件來開發一個報表。 我們創建了一個類庫和一個數據源。 最後使用ReportVIEwer控件來顯示報表。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved