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

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('','华为')
insert into rdrecord (BillCode,BillVenOrCus) values('','长虹') 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 = ; } 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# WinfForm 控件之dev报表 XtraReport (四) 动态绑定主从关系表的更多相关文章

  1. C# WinfForm 控件之dev报表 XtraReport (八)动态生成报表

    功能说明:生成一个报表文件DV1,保存到本地AA.rep,再重新加载这个文件到DV2 1.布局如下图: panel1 上有三个button panel2上有个documentView dv1 pane ...

  2. C# WinfForm 控件之dev报表 XtraReport(三) 动态数据绑定

    代码还用上一节的,把reportFrx的dataSource去掉.各cell绑定的字段也去掉,有了第二节的基础,现在看这个ms就不难了 无非就是 传到reportFrx一个数据集 在把这个数据集 绑到 ...

  3. C# WinfForm 控件之dev报表 XtraReport (二) 固定数据绑定

    已经子解了XtraReport的初步用法 现在再进一步了解 数据绑定 我们还是先不整高深的 先来个写死的 让我们的数据库数据可以通过报表呈现先 1.准备 还在上节基础上 只不过我把form1 中的Do ...

  4. C# WinfForm 控件之dev报表 XtraReport (一) 初了解

    这个控件其实用法和fast也差不了太多但如果没接触过 真有种老虎吃天的感觉 1.这里先不说那些高深的先说最基本的 在窗体中显示一个设计好的 模版 1.1一般设计和这个程序是分着的为了方便我就先把他们合 ...

  5. C# WinfForm 控件之dev报表 XtraReport (七)报表合并

    这个不是太难,新建两个报表 一个form窗体 窗体上放个documentView  代码如下 XtraReport2 xr2 = new XtraReport2(); xr2.CreateDocume ...

  6. C# WinfForm 控件之dev报表 XtraReport (五) 并排报表

    有了前边的基础这个就很简单了,建一个容器报表 在detail,上放两个xrsubReport.再做两个明细报表,分别指定到xrsubreport就可以了

  7. C# WinfForm 控件之dev图表 ChartControl

    dev 图表控件 学习连接 新建一个winformApp form1上放一个button 再放一个chartControl Name 为cct 直接上代码 private void button1_C ...

  8. C# WinfForm 控件之dev电子表格 SpreadSheet

    网上找了一些资料可是不得入门 只能再回过头来看demos 看了一点 例子大多继承自SpreadsheetRibbonTutorialControlBase 这个类,它又继承自SpreadSheetTu ...

  9. C# WinfForm 控件之dev表格 GridControl

    基本用法 1.新建一个winformAPP 放一个gridControl 为gridC 再放一个button 用法与dataGrid一样 代码如下: /// <summary> /// 显 ...

随机推荐

  1. vue入门例子

    vue入门例子 1.声明示渲染        {{message}} 2.绑定事件 v-bind 3.控制切换一个程序是否显示        v-if 4.渲染循环                  ...

  2. 搭建RAID5(5块硬盘)过程并模拟一块磁盘损坏情况

    首先:在配置RAID5之前我们先来了解一下它.RAID5,RAID是指独立磁盘冗余阵列,是把相同的数据存储在多个硬盘的不同地方的方法.通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能 ...

  3. Django框架(十七)—— 中间件、CSRF跨站请求伪造

    目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...

  4. Java输入/输出教程

    Java输入/输出(I/O)处理从源读取数据并将数据写入目标.通常,读取存储在文件中的数据或使用I/O将数据写入到文件中. java.io和java.nio包中包含处理输入/输出的Java类.java ...

  5. springMvc注册时图形验证码完整代码与详细步骤``````后续更新注册时对密码进行加密

      第一使用 画图软件制作图片 ,文件名就是验证码    ------用户的实体类 import java.util.Date; public class Member {    private in ...

  6. CSS3 动画Animation的8大属性

    animation复合属性.检索或设置对象所应用的动画特效. 如果有多个属性值时以","隔开,适用于所有元素,包含伪对象:after和:before 1.animation-nam ...

  7. shell 符号的定义(一)

    在shell中,在判断数值大小除了可以用”(( ))”的形式外,还可以使用”[ ]”.但是就不能使用>, < , = 这样的符号了,要使用 -lt (小于),-gt (大于),-le (小 ...

  8. Codeforces 346D Robot Control DP spfa 01BFS

    题意及思路:https://www.cnblogs.com/zjp-shadow/p/9562888.html 这题由于性质特殊,可以用01BFS来进行DP的转移. 代码: #include < ...

  9. CSIC_716_20191209【并发编程---GIL和协程】

    GIL   Global Interpreter Lock 全局解释锁 GIL对含IO的任务来说,会出现不能保证数据安全的情况.如下: from threading import Thread fro ...

  10. java程序中的多线程(转)

    为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬 ...