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");
            }
        }
    }

     是终效果图:

  • 相关阅读:
    Shell脚本编程(三):shell参数传递
    Java代码里利用Fiddler抓包调试设置
    Shell脚本编程(二):shell变量
    Shell脚本编程(一):初识shell script
    JAVA使用SCANNER接收中文并输出时出现乱码
    RandomAccessFile类理解
    Vue(九):样式绑定v-bind示例
    Dockerfiles ENV和ARG的应用
    dockerfile中设置python虚拟环境+gunicorn启动
    Docker容器 暴露多个端口
  • 原文地址:https://www.cnblogs.com/SoftWareIe/p/8805688.html
Copyright © 2011-2022 走看看