[原創]Devexpress XtraReports 系列 6 創建並排報表


昨天我們已經介紹了如何創建交叉報表,詳見:[原創]Devexpress XtraReports 系列 5 創建交叉報表

 

今天我們繼續我們的XtraReports系列。Demo和數據庫文件最后會附上。

 

今天的主題是:創建並排報表

 

什么是並排報表呢?

 

按照我個人理解:並排報表是把兩張或者兩張以上的報表,放在一個報表頁面。

注:為了方便,本示例使用同一個數據源,但是您可以使用相同的方法,而在一個報表文檔中顯示兩個完全不同的 (使用不同數據源的) 報表。

依照慣例,我們先來看看我們最后實現的效果,如圖:

QQ截圖20130830213558

開始講解。


第一步:窗體布局。

新建一個WinForm窗體,,拉入第三方控件SimpleButton,DocumentViewer,SplitContainerControl,LabelControl,TextEdit,GroupControl,無非就是設置空間Dock屬性,還有字體Text屬性等,簡單布局我就不多闡述了。可以參考系列第一篇。

 

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

 

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

QQ截圖20130830214457 

 

第二步:創建兩個個Devexpress XtraReport報表文件。一個是明細報表DetailSideBySideRpt(用於綁定到最后顯示的並排報表MasterSideBySideRpt),一個是最后顯示的並排報表MasterSideBySideRpt  如圖:

 

報表布局步驟如下:(不知道為什么我的設計器是中文的,英文的朋友找到相對應的就行了)

 

首先,建立一個DetailSideBySideRpt文件 如圖:

QQ截圖20130830215021

 


然后新建一個MasterSideBySideRpt,如圖:

QQ截圖20130830215630

那如何把我們新建的DetailSideBySideRpt報表,並排顯示到MasterSideBySideRpt呢?

 

方法一:如圖:

QQ截圖20130830215827

注意:我一開始不知道為什么一直不能把【創建並排報表.DetailSideBySideRpt】選擇到ReportSource,后來重新生成解決方案,就可以了。如果大家遇到選不上的時候,請試試重新生成解決方案。

 

方法二:例如代碼方式:

this.xrSubreport1.ReportSource = new 創建並排報表.DetailSideBySideRpt();

this.xrSubreport2.ReportSource = new 創建並排報表.DetailSideBySideRpt();//這里我並排的兩張報表都使用了同一個DetailSideBySideRpt,可以使用不同的

 

第三步,准備數據源,如圖:

QQ截圖20130830220333

 

第四步,一切准備就緒,接下來就來處理方法事件了。

 

a,從數據庫中獲取綁定數據源

private DataSet BindRpt()
       {
           DataSet ds = new DataSet();
           try
           {
               SqlConnection con = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=ReportDeom");
               SqlDataAdapter adapter;
               con.Open();
               SqlCommand cmd = new SqlCommand("SELECT * FROM SideBySideRptData where name=@name OR @name='' ", con);
               SqlParameter[] paras = new SqlParameter[]{
                   new SqlParameter("@name",txtName.Text.Trim())
               };
               cmd.Parameters.AddRange(paras);
               adapter = new SqlDataAdapter(cmd);
               adapter.Fill(ds, "SideBySideRpt"); ;
               con.Close();
           }
           catch (Exception ex)
           {
               throw ex;
           }
           return ds;
       }

 

b,修改DetailSideBySideRpt報表文件默認構造函數,讓其可以接收數據源並綁定字段

public DetailSideBySideRpt(DataSet ds)
{
    InitializeComponent();
    this.DataSource = ds;
    this.xrRichText1.DataBindings.Add("Text", ds, "name");
    this.xrRichText2.DataBindings.Add("Text", ds, "birthday");
    this.xrRichText3.DataBindings.Add("Text", ds, "description");
}

從上面可以很容易看出,我們只綁定了姓名,生日,簡介三個字段,那如何綁定圖片呢?

我們可以在XRPictureBox的BeforePrint事件中處理,從本地存放圖片的文件夾中獲取圖片(在此之前應該把圖片放到指定目錄下),並綁定。

如圖:把圖片放到程序運行目錄

QQ截圖20130830220903

private void xrPictureBox1_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
    string path = System.Environment.CurrentDirectory + "\\" + GetCurrentColumnValue("pictureurl");//從程序運行目錄下獲取

    xrPictureBox1.Sizing = DevExpress.XtraPrinting.ImageSizeMode.ZoomImage;//設置圖片顯示模式
    ((XRPictureBox)sender).Image = Image.FromFile(path);
}

 

c,根據最終的效果圖結合我們的數據源圖,可以發現左邊顯示體育明星,右邊顯示影視明星,如何做到的呢?

其實,我們只需要處理一下事件。利用FilterString屬性過濾數據源即可。

private void xrSubreport1_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
      ((XRSubreport)sender).ReportSource.FilterString = "category =='體育明星'";
}

private void xrSubreport2_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
    ((XRSubreport)sender).ReportSource.FilterString = "category =='影視明星'";
}

 

d,在這個示例中我利用代碼的形式給MasterSideBySideRpt綁定數據源

public MasterSideBySideRpt(DataSet ds)
     {
         InitializeComponent();
         this.xrSubreport1.ReportSource = new 創建並排報表.DetailSideBySideRpt(ds);
         this.xrSubreport2.ReportSource = new 創建並排報表.DetailSideBySideRpt(ds);
     }

 

e,最后我們處理顯示報表按鈕事件。把數據源傳遞給報表,並展示出來。

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

 

到此,我們就把一個並排報表完成了。。 個人感覺這篇寫的不是很順,有疑問的話,大家可以看看源代碼。


希望對大家有幫助。。。最后附上源碼以及數據庫備份文件

Demo地址:http://yunpan.cn/QXXFGrMsgggYH  訪問密碼 4648


免責聲明!

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



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