DataGridView显示主从表示例及注意事项.doc_第1页
DataGridView显示主从表示例及注意事项.doc_第2页
DataGridView显示主从表示例及注意事项.doc_第3页
DataGridView显示主从表示例及注意事项.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DataGridView显示主从表示例及注意事项(转)收藏(转载来源:/hulihui)在.NET的Windows Forms数据处理应用中,经常需要处理主从表情况。例如:SQL Server 2000的Northwind数据库Custumers表和Orders表中,一个客户对应多个定单(用关系数据库理论的ER概念模型描述,客户实体与定单实体是1:N的关系)。编程时,可以用一个DataGridView显示Customers记录(主表),另一个DataGridView显示当前Customer的定单明细(从表)。当点选主表DataGridView的Customers记录时,从表DataGridView自动过滤显示对应CustomerID的全部Orders记录(见上图)。C# 2005/2008中的BindingSource组件和DataSet/DataRelation类提供了一个简便的处理方法,见如下实现步骤和示例代码。1. 建立一个DataSet数据集对象,使用DataAdaper填充两个DataTable表:Customers和Orders,分别包含全部的Customers记录和Orders记录。也可直接创建和填充数据表;2. 以Custumers的主键CustomerID和Orders的外键CustomerIdD建立一个主从DataRelation关系对象,并添加该对象到DataSet中;3. 使用两个BindingSource组件:bs_Customers和bs_Orders,分别连接表数据集DataSet的表Customers和关系DataRelation;4. 使用两个DataGridView组件,分别连接bs_Customers和bs_Orders。下面是全部程序示例代码,测试运行时须有SQL Server 2000的Northwind数据库,不使用数据库且直接创建数据表的代码参见本文最后给出的简例。using System;using System.Data;using System.Data.SqlClient;using System.Windows.Forms;namespace WindowsApplication1 public partial class Form1 : Form public Form1() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) SqlConnection conn = new SqlConnection(); SqlConnectionStringBuilder ssb = new SqlConnectionStringBuilder(); conn.ConnectionString = Data Source=localhost; Initial Catalog=Northwind; Integrated Security = True; conn.Open(); DataSet dbSet = new DataSet(); / 创建数据集 using (SqlDataAdapter da = new SqlDataAdapter(select * from Customers, conn) da.Fill(dbSet, Customers); / 填充一个 Customers 表 using (SqlDataAdapter da = new SqlDataAdapter(select * from Orders, conn) da.Fill(dbSet, Orders); / 填充一个 Orders 表 DataColumn parentCol = dbSet.TablesCustomers.ColumnsCustomerID; DataColumn childCol = dbSet.TablesOrders.ColumnsCustomerID; DataRelation relation = new DataRelation(FK_Customers_Orders, parentCol, childCol); / 建立主从关系 dbSet.Relations.Add(relation); / 添加主从关系到数据集中 BindingSource bs_Customers = new BindingSource(); / 创建绑定源 BindingSource bs_Orders = new BindingSource(); bs_Customers.DataSource = dbSet; bs_Customers.DataMember = Customers; / 绑定到数据源主表 bs_Orders.DataSource = bs_Customers; bs_Orders.DataMember = FK_Customers_Orders; / 绑定到关系从表,注意:区分大小写 dataGridView1.DataSource = bs_Customers; / DataGridView 显示 dataGridView2.DataSource = bs_Orders; 与主表的常规绑定方式不同,从表bs_Orders的数据源和数据成员的绑定技巧是: bs_Orders.DataSource = bs_Customers,即主表的BindingSource数据源; bs_Orders.DataMember = FK_Customers_Orders,即数据集dsSet中的主从关系名。特别需要指出:当使用C#2005/2008编程时,从表bs_Orders的数据成员DataMember使用的关系名是区分大小写的。针对上面示例,如果代码改为:DataMember = fk_Customers_Orders,即修改FK为fk,此时程序并不报错,并且主表第一条记录对应的从表记录是正确的!但浏览移动主表记录时,从表对应的记录为空,即使主表移动到第一条记录时从表也为空!同时还需要指出如下几点: 并不要求CustomerID是Customers的主键和Orders的外键,但要满足外键的基本条件主表的CustomerID值唯一,从表的CustomerID值对应主表的某个值。见本文后面给出的程序代码; 主从关系是通过数据集DataSet、数据关系DataRelation和数据源绑定组件BindingSource体现的,与显示控件无关。此时,可以使用ComboBox、ListBox等显示主从关系情况; 主从关系中的数据表,还可以是定制的对象集,具体使用可以参考Windows Forms 2.0数据绑定.NET智能客户端数据应用程序设计一书。事实上,.NET通过字符串名称检索是其特性索引器,即通过设置和访问对象,许多情况并不区分大小写,如:DataSet.Table、DataGridViewColumns、BindingSource.DataMember(为数据表时)。为何C# 2005/2008中DataRelation的关系名区分大小写?或者是否是.NET的一个BUG?有兴趣者可以进一步探讨。下面是直接构建两个表的代码,取代前面从Northwind填充数据的两个using()语句组:private void Form1_Load(object sender, EventArgs e) DataSet dbSet = new DataSet(); / 创建数据集 DataTable customers = new DataTable(Customers); / 创建客户表 DataColumn dc = new DataColumn(CustomerID, typeof(int); / 创建字段 customers.Columns.Add(dc); customers.Rows.Add(1); / 添加两个记录 customers.Rows.Add(2); DataTable orders = new DataTable(Orders); / 创建定单表 dc = new DataColumn(OrderId, typeof(int); orders.Columns.Add(dc); dc = new DataColumn(CustomerID, typeof(int); orders.Columns.Add(dc); orders.Rows.Ad

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论