Developer Express 之 XtraReport如何动态绑定数据

XtraReport报表编辑器里的保存,是可以保存为一个文件的,所以它应该提供了一个从文件加载的方法,这时我们可以发现XtraReport里有一个LoadLayout的方法,可以加载报表文件,它的重载方法是可以从IO.Stream里加载报表文件,也就是说,我们可以进一步的把这个报表模板以二进制的方式保存在数据库里。需要的时候,从数据库调用即可。

我们在设计XtraReport的模板的时候,重写它的析构方法,一个有传入数据源的,一个没有。代码如下:

      public XtraReport1()
        {
            InitializeComponent();

        } //数据预览是有用 
       public XtraReport1(DataSet ds)//构造函数重载
        {
            InitializeComponent();
            SetDataBind(ds);
        }

        private void SetDataBind(DataSet ds)//绑定数据源
        {
            DataSource=ds;   
            this.xrTableCell4.DataBindings.Add("Text", DataSource, "test1");
            this.xrTableCell5.DataBindings.Add("Text", DataSource, "test1");
        }
填充数据代码如下:
        private void simpleButton1_Click(object sender, System.EventArgs e)
        {

            XtraReport1  xrpt1=new XtraReport1(GetTempDataSet());
            xrpt1.ShowPreviewDialog();
        }
        private DataSet GetTempDataSet()
        {
            DataSet ds=new DataSet();
            DataTable dt=new DataTable("tempTable");
            dt.Columns.Add("test1",Type.GetType("System.String"));
            dt.Columns.Add("test",Type.GetType("System.String"));
            dt.Columns.Add("test3",Type.GetType("System.String"));
            dt.Columns.Add("test4",Type.GetType("System.String"));
            dt.Columns.Add("test5",Type.GetType("System.String"));
            dt.Columns.Add("test6",Type.GetType("System.String"));
            dt.Columns.Add("test7",Type.GetType("System.String"));
            DataRow tempRow;              
            for (int i=0;i<7;i++)//i:Row
            {
                tempRow=dt.NewRow();
                tempRow[0]=i.ToString();
                tempRow[1]=i.ToString();
                tempRow[2]=i.ToString();
                tempRow[3]=i.ToString();
                tempRow[4]=i.ToString();
                tempRow[5]=i.ToString();
                tempRow[6]=i.ToString();
                dt.Rows.Add(tempRow);
            }

            ds.Tables.Add(dt);
            return ds;
        }
其中关于主从表的话,因为传进去的DaTaSet所以我们可以再外面把相应的关系指定好后加到DaTaSet。
下面给出主从表的代码:
                DataColumn parentColumns;
                DataColumn childColumns;
                parentColumns = ds.Tables["Suppliers"].Columns["SupplierID"];
                childColumns = ds.Tables["Products"].Columns["SupplierID"];
                DataRelation dsdr1 = new DataRelation("fk_1", parentColumns, childColumns);
                ds.Relations.Add(dsdr1);

                DataRelation dsdr2 = new DataRelation("fk_2", ds.Tables["Products"].Columns["ProductID"], ds.Tables["OrderDetails"].Columns["ProductID"]);
                ds.Relations.Add(dsdr2);

而模板中绑定数据的话跟上面单表是的大同小异,但是里面的绑定要记得引用的是你绑定关系的外键,也就是,如下代码:

        public XtraReport1(DataSet ds)
        {
            InitializeComponent();
            SetDataBing(ds);
        }
        private void SetDataBing(DataSet ds)
        {
          
            DataMember = "Suppliers";
            DataSource = ds;


            this.cellCompanyName.DataBindings.Add("Text", DataSource, "Suppliers.CompanyName");
            this.sContadName.DataBindings.Add("Text", DataSource, "Suppliers.ContadName");
            this.sCountry.DataBindings.Add("Text", DataSource, "Suppliers.Country");
            this.sContactTitle.DataBindings.Add("Text", DataSource, "Suppliers.ContactTitle");
            this.sRegion.DataBindings.Add("Text", DataSource, "Suppliers.Region");
            this.sPhone.DataBindings.Add("Text", DataSource, "Suppliers.Phone");
            this.sCity.DataBindings.Add("Text", DataSource, "Suppliers.City");
            this.sFax.DataBindings.Add("Text", DataSource, "Suppliers.Fax");
            this.sPostalCode.DataBindings.Add("Text", DataSource, "Suppliers.PostalCode");
            this.sHomePage.DataBindings.Add("Text", DataSource, "Suppliers.HomePage");
            this.sAddress.DataBindings.Add("Text", DataSource, "Suppliers.Address");
            this.sCompanyName.DataBindings.Add("Text", DataSource, "Suppliers.CompanyName");

            DetailReport.DataMember = "fk_1";
            DetailReport.DataSource = DataSource;

            this.pProductName.DataBindings.Add("Text", DataSource, "fk_1.ProductName");
            this.pProductID.DataBindings.Add("Text", DataSource, "fk_1.ProductID");
            this.pCategory.DataBindings.Add("Text", DataSource, "fk_1.CategoryID");
            this.pUnit.DataBindings.Add("Text", DataSource, "fk_1.QuantityPerUnit");
            this.pUnitPrice.DataBindings.Add("Text", DataSource, "fk_1.UnitPrice");
            this.pDiscontinued.DataBindings.Add("Text", DataSource, "fk_1.Discontinued");

            DetailReport1.DataMember = "fk_1.fk_2";
            DetailReport1.DataSource = DataSource;

            this.oOrderID.DataBindings.Add("Text", DataSource, "fk_1.fk_2.OrderID");
            this.oQuantity.DataBindings.Add("Text", DataSource, "fk_1.fk_2.Quantity");
            this.oDiscount.DataBindings.Add("Text", DataSource, "fk_1.fk_2.Discount");

            this.oUnitPrice.DataBindings.Add("Text", DataSource, "fk_1.fk_2.UnitPrice");

            
        }
this.pProductName.DataBindings.Add("Text", DataSource, "fk_1.ProductName")以这句来说明,"fk_1.ProductName"
这个就是子表的数据字段,这部是主从表动态绑定的关键,这样数据就会随主表数据变化而变化。

 

posted @ 2010-12-06 20:47  CookBlack  阅读(4943)  评论(3编辑  收藏  举报


作者:CookBlack
出处:http://www.cnblogs.com/CookBlack/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。