[原創]Devexpress XtraReports 系列 7 創建Drill-Down(向下鑽取)報表


昨天發表了Devexpress XtraReports系列第六篇[原創]Devexpress XtraReports 系列 6 創建並排報表,今天我們繼續。

今天的主題是創建Drill-Down報表。

首先我們來看看最后實現的效果。Demo最后附上。點擊隱藏明細,會把明細收縮,點擊顯示明細會把明細顯示出來。

接下來開始講解如何一步一步做出這個報表:

第一步,創建如上窗體,拉入控件SimpleButton,DocumentViewer,SplitContainerControl,LabelControl,TextEdit,GroupControl,簡單布局我就不多說了,跟上篇一樣的布局 ,詳見:http://www.cnblogs.com/lhmlyx2723356/p/3286101.html

提示一點:DocumentViewer控件一開始是沒有打印工具欄的,以前12.幾的版本,添加打印工具欄是拖入PrintSystem控件,但是13.1.5我發現沒有了,后來在官網找到了答案。控件12.幾的控件PrintControl, PringBarManager, PrintRibbonController都集成到了DocumentViewer ,詳情請參考http://www.devexpress.com/Support/Center/Question/Details/Q504260

 

那13.1.5如何添加打印工具欄呢?如圖:選中DocumentViewer控件右上角的三角符號,點擊紅色區域中的其中一項都可以創建打印工具欄。

QQ20130830214457_thumb1

 

第二步,創建一個DrillDown報表文件。如圖:

 QQ截圖20130901123044

第三步,我們利用數據庫做一張簡單的表並輸入一些測試值。如圖:

QQ截圖20130901123219

第四步,數據庫表,布局都做好了,接下來我們就來處理相對應的事件了。輸入文本框的值,點擊按鈕把查詢出來的數據源綁定到報表中

a,修改報表文件的構造函數,讓它在實例化的時候可以接收數據源。

public DrillDrownRpt(DataSet ds)//修改構造函數 {
    InitializeComponent();
    Bind(ds);
}

private void Bind(DataSet ds)
{
    this.DataSource = ds;
    this.DataMember = "Dept";
    DetailReport.DataMember = "RelationColumn";
    DetailReport.DataSource = ds;

      //把dept_id屬性綁定到lblShowHide的Tag屬性,當點擊lblShowHide(顯示明細/隱藏明細是)時,可以根據dept_id去判斷顯示隱藏明細情況。
    this.lblShowHide.DataBindings.Add("Tag", ds, "Dept.dept_id");

    this.xrLabel3.DataBindings.Add("Text", ds, "Dept.dept_name");
    this.xrTableCell1.DataBindings.Add("Text", ds, "RelationColumn.user_id");
    this.xrTableCell2.DataBindings.Add("Text", ds, "RelationColumn.username");
}

const string sShowDetail = "顯示明細";
const string sHideDetail = "隱藏明細";
ArrayList expandedValues = new ArrayList();

//判斷是否存在部門ID

bool ShouldShowDetail(int catID)
{
    return expandedValues.Contains(catID);
}

//根據lblShowHide的Tag屬性去判斷lblShowHide顯示文本是顯示明細還是隱藏明細

private void lblShowHide_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
    XRLabel label = (XRLabel)sender;

    //(int)label.Tag返回的是dept_id,調用ShouldShowDetail 方法,如果true則讓lblShowHide顯示隱藏明細。反之,顯示顯示明細

    if (ShouldShowDetail((int)label.Tag))

    {
        label.Text = sHideDetail;
    }
    else
    {
        label.Text = sShowDetail;
    }
}

 

private void DetailReport_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
    e.Cancel = !ShouldShowDetail((int)GetCurrentColumnValue("dept_id"));
}

//鼠標移動到lblShowHide時,鼠標樣式變成手形

private void lblShowHide_PreviewMouseMove(object sender, PreviewMouseEventArgs e)
{
    Cursor.Current = Cursors.Hand;
}

 

private void lblShowHide_PreviewClick(object sender, PreviewMouseEventArgs e)
{
    int index = (int)e.Brick.Value;
    bool showDetail = ShouldShowDetail(index);
    if (showDetail)
    {
        expandedValues.Remove(index);
    }
    else
    {
        expandedValues.Add(index);
    }
    CreateDocument();
}

b,獲取數據源

private DataSet BindRpt()
      {
          DataSet ds = new DataSet();
          try
          {
              //連接數據源,給DrillDrownRpt綁定數據源,包含兩個數據表
              SqlConnection con = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=DxReports");
              SqlDataAdapter adapter;
              con.Open();
              adapter = new SqlDataAdapter("SELECT * FROM Dept", con);
              adapter.Fill(ds, "Dept");
              adapter = new SqlDataAdapter("select  * from  Users", con);
              adapter.Fill(ds, "User");
              con.Close();

              //給數據集建立主外鍵關系
              DataColumn ParentColumn = ds.Tables["Dept"].Columns["dept_id"];
              DataColumn ChildColumn = ds.Tables["User"].Columns["dept_id"];
              DataRelation Rel = new DataRelation("RelationColumn", ParentColumn, ChildColumn);
              ds.Relations.Add(Rel);
          }
          catch (Exception ex)
          {
              throw ex;
          }
          return ds;
      }

 

c,單擊按鈕,綁定數據到報表中

private void btnShowReport_Click(object sender, EventArgs e)
{
    DataSet ds = BindRpt();
    DrillDrownRpt Rpt = new DrillDrownRpt(ds);
    this.documentViewer1.DocumentSource = Rpt;
    Rpt.CreateDocument();
}

 

到此,報表就向下鑽取報表就完成了。

希望對初學者有點幫助。謝謝。

Demo地址:http://yunpan.cn/QXzZnfJVPHQ7I  訪問密碼 4a86


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM