zoukankan      html  css  js  c++  java
  • C# WinfForm 控件之dev报表 XtraReport (四) 动态绑定主从关系表

    一般的单据都是由主从关系的,比如部门与人员、单据表头与表身、仓库与存货、分类与档案等等 所以主从关系是报表用的最多的

    1.准备数据库 简单方便

    --主表
    create table RdRecord 
    (
    id int primary key identity(1,1),
    BillCode nvarchar(32) unique not null,
    BillVenOrCus nvarchar(64),
    BillDate datetime default (getDate())
    )
    
    --从表
    create table rdrecords
    (autoid int primary key identity(1,1),
    id int not null,
    InvCode nvarchar(32),
    Quantity decimal(18,3) default 0
    )
    
    insert into rdrecord (BillCode,BillVenOrCus) values('001','华为')
    insert into rdrecord (BillCode,BillVenOrCus) values('002','长虹')
    
    insert into rdrecords(id,invCode,Quantity) values(1,'彩电',2000)
    insert into rdrecords(id,invCode,Quantity) values(1,'手机',2000)
    insert into rdrecords(id,invCode,Quantity) values(1,'手表',2000)
    
    insert into rdrecords(id,invCode,Quantity) values(4,'彩电',5000)
    insert into rdrecords(id,invCode,Quantity) values(4,'手机',20)
    insert into rdrecords(id,invCode,Quantity) values(4,'手表',100)

    1.窗体还用上节的form1,报表新建一个ParentAndSonReport 控件有点多 我就用图表示了。 学习来自连接

    2 form1 加一个button 一个textBox 双击button2写下代码 查出主从表,并确定关系

     private void btnPAndS_Click(object sender, EventArgs e)
            {
                using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=123;database =test"))
                {
                    DataSet ds = new DataSet();
                    int iID;
                    if (int.TryParse(textBox1.Text, out iID))
                    {
                    }
                    else
                    { iID = 0; }
    
                    con.Open();
                    SqlCommand cmd = new SqlCommand("select * from rdrecord  --where id =@id "); //可查询单个数据 这个就不说了 这样 主从体现不出来 所以注释掉了
                    cmd.Connection = con;
                    cmd.Parameters.Add(new SqlParameter("@id", iID));
                    SqlDataAdapter ada = new SqlDataAdapter(cmd);
                    ada.Fill(ds, "RD");//查出 主表 填充 dataset 名为RD
    
                      cmd = new SqlCommand("select * from rdrecords  --where id =@id    ");//同上
                    cmd.Connection = con;
                    cmd.Parameters.Add(new SqlParameter("@id", iID));
                      ada = new SqlDataAdapter(cmd);
                    ada.Fill(ds, "RDS");//细表 同上
    
                    //建立主从关系
                    DataColumn ParentColumn = ds.Tables["Rd"].Columns["ID"];
                    DataColumn ChildColumn = ds.Tables["Rds"].Columns["id"];
                    DataRelation rel = new DataRelation("Rel", ParentColumn,ChildColumn);
                    ds.Relations.Add(rel);
    
                    ParentAndSonReport psr = new ParentAndSonReport(ds);
                    documentViewer1.DocumentSource = psr;
                    psr.CreateDocument();
                }
            }

    3.报表重载构造函数 数据绑定

    namespace XtrReportLearn
    {
        public partial class ParentAndSonReport : DevExpress.XtraReports.UI.XtraReport
        {
            public ParentAndSonReport()
            {
                InitializeComponent();
            }
    
            //重载 最好复制无参构造函数再修改 我总会忘掉初始化
            public ParentAndSonReport(DataSet ds)
            {
                InitializeComponent();
    
                //如果出现 只有一条数据问题那么绑定出问题了 要检查下边的绑定
                this.DataSource = ds;
                this.DataMember = "RD";            
    
                this.DetailReport.DataMember = "Rel";//这个地方一定要是关系的名字 不然 从表数据就全出来了 分不开了
                this.DetailReport.DataSource = ds;
    
                RDID.DataBindings.Add("Text", ds, "rd.ID");
                BillCode.DataBindings.Add("Text", ds, "rd.BillCode");
                BillDate.DataBindings.Add("Text", ds, "rd.BillDate");
    
                RDIDs.DataBindings.Add("Text", ds, "Rel.ID");
                InvCodoe.DataBindings.Add("Text", ds, "Rel.InvCode");
                Quantity.DataBindings.Add("Text", ds, "Rel.Quantity");
            }
        }
    }

     是终效果图:

  • 相关阅读:
    c# 02-18 值类型 引用类型 字符串的不可变性 字符串的处理方法
    c#0218-命名空间
    c#学习0217
    BootStrap学习
    c#学习0216
    AngularJS学习
    java面试题之什么是死锁、活锁、饿死和竞态条件?
    java面试题之能创建volatile数组吗?
    java面试题之sleep()和wait()方法的区别
    java面试题之Thread的run()和start()方法有什么区别
  • 原文地址:https://www.cnblogs.com/SoftWareIe/p/8805688.html
Copyright © 2011-2022 走看看