使用数据绑定控件
Working with Data-Bound Controls
让我们再来看一种与此不同更具声明性的方式。创建一个新的Windows Forms Solution(称之为DeclarativeDataDisplay)。先扩大窗体,将其重新命名为DeclarativeDB.cs,将其标题改为Declarative Data Base。拖放一个DataGridView到窗体上。
就位后,会出现一个Action菜单。点击下拉菜单,选择一个数据源。点击Add Project Data Source,打开Data Source Configuration Wizard。点击Next,选择数据类型,如图14-3所示。

图14-2:使用OLE DB托管提供程序

图14-3:Data Source Configuration Wizard
点击Database并点击Next。在Data Source Configuration Wizard中,点击New Connection,如图14-4。
为Connection Properties填入相应的信息,如图14-5所示。

图14-4:选择一个数据连接

图14-5:设置连接属性
在点击OK之前,一定要点击Test Connection按钮。在下一个选项卡,选中"Yes, save the connection as"和"Include sensitive data",如图14-6所示。

图14-6:保存敏感数据
将显示所选DataSet的内容。在这里,打开表,打开Customers表。选择除Region之外的所有列(这是为了说明查询不需要返回所有列),并点击Finish。
点击数据网格的选项卡,选择Edit Columns。编辑列标题为有意义的文字,如图14-7所示。
返回程序。已经绑定了数据,如图14-8所示。
查看数据窗格下面的对象栏中,能够发现三个对象:northwindDataSet,CustomerData- Connector和customersTableAdapter,如图14-9所示。
其中每个对象都可以通过点击对象然后在Properties窗口中设置属性。
编程填充DataGrid
Populating a DataGrid Programmatically
如果非要坚持手工创建这些连接,当然是可行的,还可以手工地将它们与数据窗格连接起来。
创建一个名为ProgrammaticDataDisplay的项目,重命名.cs文件和窗体,并相应地设置标题。将一个DataGridView拖放到位,但是忽略掉Action菜单。

图14-7:编辑列

图14-8:实际中的数据窗格
右击窗体,选择View Code。在构造方法中添加如下行代码:
string connectionString = "server=localhost;" +
"Trusted_Connection=yes; database=northwind";
string commandString =
"Select CompanyName, ContactName, ContactTitle, "
+ "Phone, Fax from Customers";
// 创建一个数据集并填充它
SqlDataAdapter DataAdapter =
new SqlDataAdapter( commandString, connectionString );

图14-9:查看对象栏中的对象
DataSet DataSet = new DataSet( );
DataAdapter.Fill( DataSet, "Customers" );
// 将DataSet与窗格绑定
dataGridView1.DataSource =
DataSet.Tables["Customers"].DefaultView;
这里,手工设置了连接字符串和命令字符串,然后创建了一个SqlDataAdapter和DataSet获取数据。接下来将dataGridView的DataSource属性绑定到被检索的Customers的DefaultView。
通过编程或者声明设置DataGridView的属性都可以,而且可以混合使用两种方式。但是显然,Microsoft已经花了很大的功夫,才实现了只需在窗体上拖放数据库连接控件,这使与ADO.NET的互操作大大简化了。
定制DataSet
Customizing the DataSet
我们可以精确地控制创建DataSet的方方面面,不用默认设置。同样,也可以通过编程和声明两种方式。
上例中,创建DataSet的时候,传入了一个commandString和一个connectionString:
SqlDataAdapter DataAdapter =
new SqlDataAdapter(commandString, connectionString);
它们在系统内部将分别赋值给一个SqlCommand对象和一个SqlConnection对象。也可以显式地创建这些对象:
下例中,将给出4个新的类成员:
private System.Data.SqlClient.SqlConnection myConnection;
private System.Data.DataSet myDataSet;
private System.Data.SqlClient.SqlCommand myCommand;
private System.Data.SqlClient.SqlDataAdapter DataAdapter;
连接是通过用连接字符串实例化SqlConnection对象实现的:
string connectionString = "server=(local)\\NetSDK;" +
"Trusted_Connection=yes; database=northwind";
myConnection = new System.Data.SqlClient.SqlConnection(connectionString);
然后显式地打开连接:
myConnection.Open( );
通过保持此连接,可以重用它(下例中可以看到),必要时还可以使用它的事务支持。
提示:也可以允许DataAdapter创建连接,然后显式打开它,或者使用类似于如下的代码保存一个指向它的引用:
SqlConnection myConnection = myAdapter.Connection
接下来显式创建DataSet对象并设置它的一个属性。
myDataSet = new System.Data.DataSet( );
myDataSet.CaseSensitive=true;
将CaseSensitive设为true,表示DataTable对象中的字符串比较是区分大小写的。
接下来,显式创建SqlCommand对象,并将连接对象赋给新的命令对象和命令文本:
myCommand = new System.Data.SqlClient.SqlCommand( )
myCommand.Connection=myConnection;
myCommand.CommandText = "Select * from Customers";
最后,创建SqlDataAdapter对象并将其赋值给刚才生成的SqlCommand对象,告诉DataSet如何映射表列,使用正在搜索的表,同时让SqlDataAdapter填充DataSet对象。
DataAdapter = new System.Data.SqlClient.SqlDataAdapter();
DataAdapter.SelectCommand= myCommand;
DataAdapter.TableMappings.Add("Table","Customers");
DataAdapter.Fill(myDataSet);
完成后,就可以填充DataGridView了(注意这一次DataGrid使用了默认名):
dataGrid1.DataSource=
myDataSet.Tables["Customers"].DefaultView;
示例14-3 提供了完整的源代码。
示例14-3:定制DataSet
#region Using directives
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;
#endregion
namespace CustomizedDataSet
{
partial class CustomizedDataSet : Form
{
private System.Data.SqlClient.SqlConnection myConnection;
private System.Data.DataSet myDataSet;
private System.Data.SqlClient.SqlCommand myCommand;
private System.Data.SqlClient.SqlDataAdapter DataAdapter;
public CustomizedDataSet( )
{
InitializeComponent( );
string connectionString = "server=localhost;" +
"Trusted_Connection=yes; database=northwind";
myConnection = new
System.Data.SqlClient.SqlConnection( connectionString );
myConnection.Open( );
// 创建DataSet并设置一个属性
myDataSet = new System.Data.DataSet( );
myDataSet.CaseSensitive = true;
// 创建SqlCommand对象并赋予
// 连接和查询语句
myCommand = new System.Data.SqlClient.SqlCommand( );
myCommand.Connection = myConnection;
myCommand.CommandText = "Select * from Customers";
// 创建DataAdapter对象
// 并传入SQL Command对象,建立表映射
DataAdapter = new System.Data.SqlClient.SqlDataAdapter( );
DataAdapter.SelectCommand = myCommand;
DataAdapter.TableMappings.Add( "Table", "Customers" );
// 让DataAdapter对象填充DataSet
DataAdapter.Fill( myDataSet );
示例14-3:定制DataSet(续例)
// 在窗格中显示
dataGridView1.DataSource =
myDataSet.Tables["Customers"].DefaultView;
}
}
}






