通常情况下,DataGridView 控件并不直接绑定到数据源,而是绑定到 BindingSource 组件,再将 BindingSource 组件绑定到其他数据源或使用业务对象填充该组件。如图4所示。

图4 DataGridView 控件、BindingSource 组件与数据之间关系示意图
由于BindingSource 组件可以绑定到各种数据源,并可以自动解决许多数据绑定问题,所以选择BindingSource 组件作为DataGridView 控件的数据源。
最后,为项目添加一个窗体来容纳DataGridView控件,用作录入、编辑数据作的界面。当用户从主窗体选择菜单“数据”以后,将显示这个窗体。
1) 体的名称为“DataForm”。
2) 体的Text属性为“数据”。
3) 保持DataGridView控件的Name属性的默认值“dataGridView1”不变。
4) 保持BindingSource 组件的Name属性的默认值“bindingSource1”不变。
5) 适当调整DataGridView控件的位置和大小,并相应调整窗体的大小。
窗体的布局(设计区域)如图5 所示。

图5 DataForm窗体的布局
⑵ 从数据库取数据
为了从数据库取数据,在DataForm类中编写一GetData方法。
该方法对一个 SqlDataAdapter 组件进行初始化,并使用该组件填充 DataTable。然后,将 DataTable 绑定到 BindingSource 组件。
在对 SQLDataAdapter 组件进行初始化时,使用了两个参数selectCommand和connectionString:
1) electCommand是一个SQL命令的字符串,例如SELECT(查询)、UPDATE(更新)或DELETE(删除),字符串必须符合SQL语法规范。该参数由这个方法的调用者传入。
2) onnectionString是一个连接字符串,用于连接数据库。它的设置随数据库不同而不同。对于这个程序使用的数据库而言,其设置是:
“Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Stock; Data Source=localhost”
连接字符串的设置也有严格的规定,其中参数的含义如下:
1) ta Source 要连接的 SQL Server 实例的名称或网络地址。
2) ersist Security Info 如果将该关键字设置为 true 或 yes,允许在打开连接后,从连接中获得涉及安全性的信息(包括用户标识和密码)。如果将 Persist Security Info 保持为 false或 no,则不允许从连接中获得涉及安全性的信息。
3) nitial Catalog 数据库的名称。
4) ntegrated Security 当设置为 false 时,将在连接中指定用户 ID 和密码;为 true 时,将使用当前的 Windows 帐户进行身份验证。
此外,SQLDataAdapter 类型的dataAdapter变量是作为 DataForm类中的一个成员变量被定义的:
private: SQLDataAdapter^ dataAdapter;
GetData方法的代码如下:
private: void GetData(String^ selectCommand)
{
try
{
// 指定一个连接字符串。这好比选择路径的方向,
// 如果方向不对,则无法建立通路。对于不同数据
// 库,其连接字符串设置也不同。
String^ connectionString =
"Integrated Security=SSPI;Persist Security Info=False;" +
"Initial Catalog=Stock;Data Source=localhost";
// 生成一个基于特定查询、特定数据连接的SqlDataAdapter实例。
dataAdapter = gcnew SqlDataAdapter(selectCommand,
connectionString);
// 实例化 SQLCommandBuilder 来产生
// SQL更新、插入和删除命令。
gcnew SQlCommandBuilder(dataAdapter);
// 组装一个数据表并绑定到 BindingSource组件。
DataTable^ table = gcnew DataTable();
dataAdapter->Fill(table);
bindingSource1->DataSource = table;
// 调整DataGridView控件的列数以适合新
// 近加载的数据表。
dataGridView1->AutoResizeColumns(
DataGridViewAutoSizeColumnsMode::
AllCellsExceptHeader);
}
catch (SQlException^)
{
MessageBox::Show("为了运行实例程序,用一个对"
+"于你的系统是有效的连接字符串"
+"代替connectionString变量的值。");
this->Close();
}
}
最后,由于方法中引用了SQLException 、SQLDataAdapter等类,还要在DataForm.h文件中类签名上方为 System::Data::SQLClient 命名空间添加“using namespace”声明,以获得访问这些类的权限:
using namespace System::Data::SqlClient;
⑶ 显示数据
前面已经准备好了数据,也准备好了显示数据的界面,显示数据就非常简单。
在窗体DataForm中的Load事件中,将DataGridView控件绑定到BindingSource组件,同时以“select * from StockList”字符串作为参数调用GetData方法。
“select * from StockList”是SQL查询命令,它被传入GetData方法中,与连接字符串一起作为参数,实例化由SQLDataAdapter声明的dataAdapter变量。
DataForm_Load代码如下:
private: System::Void DataForm_Load(System::Object^ sender, System::EventArgs^ e)
{
// 绑定 DataGridView 到 BindingSource组件
// 并且从数据库加载数据。
dataGridView1->DataSource = bindingSource1;
GetData("select * from StockList");
}
至此,可以在窗体DataForm中显示数据了。还要解决的问题是:从主窗体的“数据”菜单显示窗体DataForm。
在窗体设计器中打开StockMrktAnls.h文件,然后双击“数据”菜单,即在代码编辑器中打开StockMrktAnls.h代码文件,并自动生成了数据ToolStripMenuItem_Click事件的过程体。
在ToolStripMenuItem_Click过程中添加以下代码:
DataForm^ datafrm=gcnew DataForm();
datafrm->Show();
最后,在StockMrktAnls.h代码文件的顶部添加一行代码,将DataForm窗体的头文件包含进来:
#include "DataForm.h"
⑷ 保存数据
现在,虽然可以显示数据,也可以对数据进行修改,但是修改的结果只显示在DataGridView 控件中,当关闭窗体后,修改并没有保存到数据库。
为了保存修改,还要做以下工作:
1) 在窗体DataForm中添加一个Button控件,名称属性设置为“submitButton”,Text属性设置为“保存数据”。
2) 编写Button控件的Click事件代码:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
try
{
// 用用户的修改更新数据库。
dataAdapter->Update((DataTable^)bindingSource1->DataSource);
// 关闭当前窗体。
this->Close();
}
catch (SQLException^)
{
MessageBox::Show("日期必须唯一,每一行的日期不能相同。");
}
}
⑸ 将连接字符串保存在应用程序配置中
前面在讲解从数据库取数据时,提到要设置一个用于连接数据库的连接字符串。它的设置只随数据库不同而不同。对于这个实例程序来说,使用的数据库始终相同,因此连接字符串也始终相同。实例程序不仅在本讲中使用,还要在后两讲中使用。因此,可以将连接字符串保存在应用程序配置文件 app.config中,在需要使用的时候从 app.config中读取。
app.config文件是一个XML 文本文件,包含应用程序特定的一些设置。它既包含公共语言运行库读取的设置(如程序集绑定策略、远程处理对象等等),也包含应用程序可以读取的设置。
使用app.config文件有两大优点:
1)减少代码量并易于维护。如果将需要重复使用的变量分散在多处代码中,不仅要重复录入,而且一旦改动则需要遍历项目中所有引用这个变量的代码。但是,如果将变量集中保存在app.config 文件中,只需录入一次,改动也只需更改一个地方。 2)当更改配置后,无需重新编译应用程序即可更新应用程序的某些配置数据。例如,当数据库迁移到另一个不同的服务器以后,只需修改app.config 文件中数据库连接配置,不需要重新编译和重新部署这个应用程序就可以适应新的服务器的要求。
|