您的位置:首页 > 编程语言 > C语言/C++

2012年12月31日 Visual C++ 2008入门经典 第二十三章 在Windows Forms应用程序中访问数据源

2013-01-01 10:32 369 查看
/*
第二十三章 在Windows Forms应用程序中访问数据源
我们将研究如何开发基于窗体的应用程序来显示各种来源的数据,明确地说,就是如何创建可访问现有数据库的基于窗体的程序
1 在封装数据库方面都涉及哪里些类
2 如何使用DataGridView控件显示自己的数据
3 如何定制DataGridView控件的外观
4 BindingSource组件的功能,如何结合DataGridView控件使用该组件
5 如何使用BindingNavigator控件来访问BindingSource控件管理的数据源的数据
6 如何使用BindingNavigator控件和BindingSource组件,执行数据库的更新
提示:
VC++为创建基于窗体的,访问数据源的应用程序提供了高度的自动化功能,但我们一开始将忽略这种自动化,以获得如何以编程方式处理这些组件的感性认识,利用这种方法,不仅能够获得对工作原理的深刻理解,而且可以认识到自动化功能为我们做了多少事情

23.1 使用数据源
数据源是供应用程序使用的任何数据的来源,关系数据库,可访问数居的web服务以及对象都可以是数据库
数据源是由类对象表示的,因此给项目添加数据源必须要添加许多类的定义

数据源  定义数据源的类是从System::Data命名空间中定义的DataSet为派生的,访我的的内存中封装了项目中可访问的数据库内存所有数据的缓存

数据库表 数据库中的每一个表都是由表示数据的DataSet类的嵌套类定义的,而定义表的类是从System::Data::DataTable类派生的,表示表的类还定义了表中数据被修改时将产生的事件以及一些属性,以使当前数据库记录的各个值可用
数据源中的每个表都是由DataSet类中的成员标识的,该成员是指向相应DataTable对象的句柄

列表 特定数据库表中的每一列都是由定义该表的DataTable类的成员标识的,表示表列的成员属于System::Data::DataColumn类型,该类定义了表列的特性--比如列名和列内数据的类型,这些特性统称为列的模式

表行 表中的行由System::Data::DataRow类型的对象表示,DataRow对象包含一行内的数据,DataTable对像中有多少列,DataRow对像就有多少个数据项

23.2 访问并显示数据
在System::Windows::Forms命名空间内定义了3个组件,共同使用它们可以在windows Forms应用程序中访问并显示数据

DataGridView 该控件可以在矩形网格中显示几乎任何种类的数据,该控件的使用可以完全独立于其他两个组件

BindingSource 该组件用来封装来自数据源的数据,可以管理对数据源的访问和更新,还可以用作显示DataGridView控件中数据的载体

BindingNavigator 该控件提供一个工具栏,其中包含对数据源(通常是封装在BindingSource控件中的数据源)中的数据进行定位和操作的控件

提示:
注意,我们还可以使用SqlConnection SqlDataAdapter和DataSet控件来访问数据源,如果想使用这些控件,可能需要新自将它们添加到ToolBox中,添加方法是从主菜单上选择Tools|Choose ToolBox,然后选中列表中希望添加到ToolBox中的控件

23.3 使用DataGridView控件
可能在三种模式中使用DataGridView控件
无约束模式  在无约束模式中,我们要负责亲自给控件传输数据,通常是使用该控件的Rows属性提供的Add()函数,应使用该模式来显示相对少量的数据

约束模式 在该模式中,通过设置DataGridView控件的DataSource属性值来标识要显示的数据的来源

虚拟模式 在虚拟模式中,将DataGridView控件连接到内存中已经允满来自独立数据源的数据的数据缓存,当我们希望对数据访问进行管理以优化性能时,应当使用该模式来显示来自数据源数据

23.4 在无约束模式中使用DataGridView控件
DataGridView控件中的数据存储在由该控件的Rows和Columns属性标识的矩阵中

下面的语句先创建一个使用句柄dataGridView来引用的控件,然后将其列数设置为3:

DataGridView^ dataGridView = gcnew DataGridView;
dataGridView->ColumnCount = 3;

可以选择对控件中的这些列加以标识,方法是设置每一个列的Name属性,指定标识每列数据的题头,
dataGridView->Columns[0]->Name = L"Name";
dataGridView->Columns[1]->Name = L"Phone Number";
dataGridView->Columns[2]->Name = L"Address";

Rows属性返回的值是DataGridViewRowCollection类型的集合,该类型是在System::Windows::Forms命名空间内定义的,此集合的Count属性返回行数,其默认的索引属性可返回给定索引位置的一行,行的集合拥有大量的函数,这里不打算介绍全部这些函数
Add()     在集合中添加一行或多行
Insert()  在集合中插入一行或多行
Clear()   删除集合中的所有行
AddCopy() 添加实参指定的行的副本
InsertCopy() 在第二个实叁指定的位置插入第一个实参指这下的行的副本
Remove()  删除DataGridViewRow类型的实参指定的行
RemoveAt() 删除作为实参提供的索引值指定的行

Rows属性返顺的值是Add函数有四个重载版本
Add()  在集合中添加一个新行
Add(int rowCount) 给集合添加rowCount个新行,如果rowCount是0或者负数,由抛出一个
System::ArgumentOutOfRangeException类型的异常
Add(DataGridViewRow^ row) 添加实叁指定的一行,DataGridViewRow对象包含一行中单个元格的集合以及确定该行单元格外观的参数
Add(... Object^ object) 添加一个新行,并以实参指定的对象填充该行内的单元格

dataGridView->Rows->Add(L"Fred Able",L"914 969 1200", L"1235 First Street, AnyTown");
dataGridView->Rows->Add(L"May East",L"914 969 1399", L"1246 First Street, AnyTown");
如果试图在一行内添加数据超过控件中列数的数据项,则多余的数据项被忽略

试一试: 无约束的模式中的DataGridView控件
因为将添加字符串和为要显示的数据,列表中的其他列类型在单元格中提供各种表示数据的控件
DataGridViewButtonColumn 该类型用来在列内的各个单元格中显示按钮
DataGridViewCheckBoxColum 当我们希望在列内的单元格中以复选框形式存储bool值(System::Boolean对象)或System::Windows::Forms::CheckState对象时,应当使用该类型
DataGridViewComboBoxColumn 录我们希望在列内各个单元格中显示下拉列表时,使用该类型
DataGridViewImageColumn 当列中各个单元格要显示图像时,选择该类型
DataGridViewLinkColumn 当列中各个单元格要显示链接时,使用该类型

23.5 定制DataGridView控件
DataGridView控件中各个单元格的外观是由于DataGridViewCellStyle类型的对像来决定的

DataGridView控件中的每个单元格都是由System::Windows::Forms::DataGridViewCell对像表示的,而包括题头单元格在内的任何特定单元格的外观都是由单元格对象的InheritedStyle属性值决定

23.5.1 定制题头单元格
1 表示单元格的DataGridViewCell对像的Style属性
2 控件对像的ColumnHeadersDefaultCellStyle属性或RowHeadersDefaultCellStyle属性
3 控件对象的DefaultCellStyle属性

23.5.2 定制非题头单元格
试一试,设置DataGridView控件的外观
1 创建数据
2 创建控件
3 创建列题头
4 格式化列
5 定制交替行

23.5.3 动态设置单元格的样式
当单元格的内容需要格式化以做好显示准备时,DataGridView控件的CellFormatting事件会产生,因此通过添加该事件的处理程序,就可以根据要显示的内容调整任何单元格的外观

试一试: 使鼠标指针下面的单元格醒目显示
注意当鼠标指针位于列题头所在行时,RowIndex属性的值是-1;当鼠标指针在某个行题头上面时,ColumnIndex属性的值是-1;

23.6 使用约束模式
接口
System::Collections::llist 实现该接口的类表示可以通过单个索引访问的对象的集合,所有C++/CLI一维数组都实现了该接口,因此DataGridView对象可以使用任何一个一维数组为要显示的数据的来源,lList接口继承了在System::Collections命名空间内定义的ICollection和我IEnumerable接口类的成员
System::ComponentModel::lListSource 实现该接口的类可以使数据作为列表(属于lList对像)从其他对像使用,该列表可以包含同样实现了lList接口的对象

System::ComponentModel::IBindingList 该接口类扩允了lList接口类,可适应更复杂的数据绑定情况
System::ComponentModel::IBindingListView 给IBindingList接口添加了排序的过滤功能,我们在本章稍后将遇到的BindingSource类定义了一个实现该接口的控件

23.7 BindingSource组件
试一试: 使用BindingSource组件
后面的测试无法进行了,因为在为dataGridView加载数据源时出错,无法解决

*/


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: