昨天發表了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控件右上角的三角符號,點擊紅色區域中的其中一項都可以創建打印工具欄。
第二步,創建一個DrillDown報表文件。如圖:
第三步,我們利用數據庫做一張簡單的表並輸入一些測試值。如圖:
第四步,數據庫表,布局都做好了,接下來我們就來處理相對應的事件了。輸入文本框的值,點擊按鈕把查詢出來的數據源綁定到報表中
a,修改報表文件的構造函數,讓它在實例化的時候可以接收數據源。
public DrillDrownRpt(DataSet ds)//修改構造函數 {
InitializeComponent();
Bind(ds);
}private void Bind(DataSet ds)
//把dept_id屬性綁定到lblShowHide的Tag屬性,當點擊lblShowHide(顯示明細/隱藏明細是)時,可以根據dept_id去判斷顯示隱藏明細情況。
{
this.DataSource = ds;
this.DataMember = "Dept";
DetailReport.DataMember = "RelationColumn";
DetailReport.DataSource = ds;
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)
//(int)label.Tag返回的是dept_id,調用ShouldShowDetail 方法,如果true則讓lblShowHide顯示隱藏明細。反之,顯示顯示明細
{
XRLabel label = (XRLabel)sender;
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