微软提供了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; } } }