尔冬橙

博客园 首页 新随笔 联系 订阅 管理

微软提供了DataGridView以替代DataGrid,但为了向下兼容,在新版的.net Framework中还是提供了DataGrid。

如果要在一个DataGrid中实现主从表的功能。关键是创建DataSet中表之间的关系。

此示例在DataGrid和DataGridView控件分别实现中显示2个关联表的数据,NorthWind数据库中的Customers表和Orders表是一对多的关系,Customers表的主键CustomerID作为Orders表的外键。

如:

            //创建表之间的关系。
            DataRelation dataRelation;
            DataColumn dataColumn1, dataColumn2;
            dataColumn1 = myDs.Tables["Customers"].Columns["CustomerID"];
            dataColumn2 = myDs.Tables["Orders"].Columns["CustomerID"];
            dataRelation = new DataRelation("CustomersToOrders",dataColumn1,dataColumn2);

            //在DataSet中添加关系
            myDs.Relations.Add(dataRelation);

然后,设置DataGrid的相关属性,显示数据:

            //设置DataGridView的视图和DataMembers成员并显示数据
            DataViewManager DataSetView = myDs.DefaultViewManager;
            dataGrid1.DataSource = DataSetView;
            dataGrid1.DataMember = "Customers";

运行结果如下图:

全部代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//此示例在DataGridView控件中显示2个关联表的数据。
//NorthWind数据库中的Customers表和Orders表是一对多的关系。
//Customers表的主键CustomerID作为Orders表的外键。
namespace WindowsFormsApplication6
{
    using System.Data.SqlClient;
    public partial class Form1 : Form
    {
        private SqlConnection myConn;//数据库连接对象
        private DataSet myDs;//数据集
        private SqlCommand myCmd1,myCmd2;//数据库命令对象。
        private SqlDataAdapter myDataAdt1,myDataAdt2;//数据适配器。

        public Form1()
        {
            InitializeComponent();
            //创建数据库连接连接对象,实例化,并打开连接。
            //如果不会写连接字符串,可以在IDE中数据-->添加数据源
            //然后选择要连接的数据库,把产生出来的连接字符串复制过来就好。
            string conStr = "Data Source=.;Initial Catalog=NorthWind;Integrated Security=True";
            myConn = new SqlConnection(conStr);
            myConn.Open();

            //创建DataSet
            myDs = new DataSet();
            myDs.CaseSensitive = true;//此数据集的字符串比较区分大小写(大小写敏感)
            
            //为Customer表创建数据库命令并用数据适配器填充数据到数据集。
            myCmd1 = new SqlCommand();
            myCmd1.Connection = myConn;
            myCmd1.CommandText = "select * from Customers";
            myDataAdt1 = new SqlDataAdapter();
            myDataAdt1.SelectCommand = myCmd1;
            myDataAdt1.TableMappings.Add("Table", "Customers");
            myDataAdt1.Fill(myDs);

            //为Orders表创建数据库命令并用数据适配器填充数据到数据集。
            myCmd2 = new SqlCommand();
            myCmd2.Connection = myConn;
            myCmd2.CommandText = "select * from Orders";
            myDataAdt2 = new SqlDataAdapter();
            myDataAdt2.SelectCommand = myCmd2;
            myDataAdt2.TableMappings.Add("Table", "Orders");
            myDataAdt2.Fill(myDs);

            //创建表之间的关系。
            DataRelation dataRelation;
            DataColumn dataColumn1, dataColumn2;
            dataColumn1 = myDs.Tables["Customers"].Columns["CustomerID"];
            dataColumn2 = myDs.Tables["Orders"].Columns["CustomerID"];
            dataRelation = new DataRelation("CustomersToOrders",dataColumn1,dataColumn2);

            //在DataSet中添加关系
            myDs.Relations.Add(dataRelation);

            //设置DataGridView的视图和DataMembers成员并显示数据
            DataViewManager DataSetView = myDs.DefaultViewManager;
            dataGrid1.DataSource = DataSetView;
            dataGrid1.DataMember = "Customers";
        }
    }
}

 上述是在DataGrid中实现主从表功能。在DataGirdView中,一个DataGridView无法显示多个表。要想实现主从表的功能,微软MSDN的变通的方法是:

用2个DataGridView,一个显示主表数据,一个显示从表数据,在主表中选择一行记录,从表中也会随之变化,显示相应的记录。 实现的关键是:

    把数据集绑定到主绑定源masterBindingSource

    把从数据源绑定到主数据源。
    用数据表之间的关系CustomersToOrders基于主表的当前行中从从表中筛选数据。

如下代码所示:

            //把数据集绑定到主绑定源masterBindingSource
            masterBindingSource.DataSource = myDs;
            masterBindingSource.DataMember = "Customers";

            //把从数据源绑定到主数据源。
            //用数据表之间的关系CustomersToOrders基于主表的当前行中从从表中筛选数据。
            detailsBindingSource.DataSource = masterBindingSource;
            detailsBindingSource.DataMember = "CustomersToOrders";

最后把数据绑定对象绑定到DataGridView:

            //设置DataGridView数据源
            masterDataGridView.DataSource = masterBindingSource;
            detailsDataGridView.DataSource = detailsBindingSource;

运行效果如图所示:

全部代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//此示例在DataGridView控件中显示2个关联表的数据。
//NorthWind数据库中的Customers表和Orders表是一对多的关系。
//Customers表的主键CustomerID作为Orders表的外键。
namespace WindowsFormsApplication6
{
    using System.Data.SqlClient;
    public partial class Form1 : Form
    {
        private SqlConnection myConn;//数据库连接对象
        private DataSet myDs;//数据集
        private SqlCommand myCmd1,myCmd2;//数据库命令对象。
        private SqlDataAdapter myDataAdt1,myDataAdt2;//数据适配器。
        //数据源绑定对象
        private BindingSource masterBindingSource = new BindingSource();
        private BindingSource detailsBindingSource = new BindingSource();
        public Form1()
        {
            InitializeComponent();
            //创建数据库连接连接对象,实例化,并打开连接。
            //如果不会写连接字符串,可以在IDE中数据-->添加数据源
            //然后选择要连接的数据库,把产生出来的连接字符串复制过来就好。
            string conStr = "Data Source=.;Initial Catalog=NorthWind;Integrated Security=True";
            myConn = new SqlConnection(conStr);
            myConn.Open();

            //创建DataSet
            myDs = new DataSet();
            myDs.CaseSensitive = true;//此数据集的字符串比较区分大小写(大小写敏感)
            
            //为Customer表创建数据库命令并用数据适配器填充数据到数据集。
            myCmd1 = new SqlCommand();
            myCmd1.Connection = myConn;
            myCmd1.CommandText = "select * from Customers";
            myDataAdt1 = new SqlDataAdapter();
            myDataAdt1.SelectCommand = myCmd1;
            myDataAdt1.TableMappings.Add("Table", "Customers");
            myDataAdt1.Fill(myDs);

            //为Orders表创建数据库命令并用数据适配器填充数据到数据集。
            myCmd2 = new SqlCommand();
            myCmd2.Connection = myConn;
            myCmd2.CommandText = "select * from Orders";
            myDataAdt2 = new SqlDataAdapter();
            myDataAdt2.SelectCommand = myCmd2;
            myDataAdt2.TableMappings.Add("Table", "Orders");
            myDataAdt2.Fill(myDs);

            //创建表之间的关系。
            DataRelation dataRelation;
            DataColumn dataColumn1, dataColumn2;
            dataColumn1 = myDs.Tables["Customers"].Columns["CustomerID"];
            dataColumn2 = myDs.Tables["Orders"].Columns["CustomerID"];
            dataRelation = new DataRelation("CustomersToOrders",dataColumn1,dataColumn2);

            //在DataSet中添加关系
            myDs.Relations.Add(dataRelation);

            //把数据集绑定到主绑定源masterBindingSource
            masterBindingSource.DataSource = myDs;
            masterBindingSource.DataMember = "Customers";

            //把从数据源绑定到主数据源。
            //用数据表之间的关系CustomersToOrders基于主表的当前行中从从表中筛选数据。
            detailsBindingSource.DataSource = masterBindingSource;
            detailsBindingSource.DataMember = "CustomersToOrders";

            //设置DataGridView数据源
            masterDataGridView.DataSource = masterBindingSource;
            detailsDataGridView.DataSource = detailsBindingSource;

        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-07-24 19:42  尔冬橙  阅读(4389)  评论(0编辑  收藏  举报