06CRecordView类
来源:互联网 发布:东南大学考研分数算法 编辑:程序博客网 时间:2024/05/01 03:44
CRecordView
(记录视图)是CFormView的派生类,它提供了一个表单视图(参见6.4.1)来显示当前记录.一个典型的记录视图如图10.3所示,用户可以通过表单视图显示当前记录.通过记录视图,可以修改、添加和删除数据.用户一般需要创建一个CRecordView的派生类并在其对应的对话框模板中加入控件.图10.3 典型的记录视图 记录视图使用DDX数据交换机制在表单中的控件和记录集之间交换数据。在前面介绍的DDX都是在控件和控件父窗口的数据成员之间交换数据,而记录视图则是在控件和一个外部对象(CRecordset的派生类对象)之间交换数据.清单10.3显示了一个CRecordView的派生类的DoDataExchange函数,读者可以看出,该函数是与m_pSet指针指向的记录集对象的域数据成员交换数据的,而且,交换数据的代码是ClassWizard自动加入的.在后面的例子中,将向读者介绍用ClassWizard连接记录视图与记录集对象的方法.清单
10.3 用来与记录集对象的域数据成员交换数据的DoDataExchange函数void CSectionForm::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSectionForm)
DDX_FieldText(pDX, IDC_COURSE, m_pSet->m_CourseID, m_pSet);
DDX_FieldText(pDX, IDC_SECTION, m_pSet->m_SectionNo, m_pSet);
DDX_FieldText(pDX, IDC_INSTRUCTOR, m_pSet->m_InstructorID, m_pSet);
DDX_FieldText(pDX, IDC_ROOM, m_pSet->m_RoomNo, m_pSet);
DDX_FieldText(pDX, IDC_SCHEDULE, m_pSet->m_Schedule, m_pSet);
DDX_FieldText(pDX, IDC_CAPACITY, m_pSet->m_Capacity, m_pSet);
//}}AFX_DATA_MAP
}
作为总结,图10.4显示了MFC的ODBC应用程序中的DDX和RFX数据交换.图10.4 DDX和RFX数据交换机制CRecordView
本身提供了对下面四个命令的支持:ID_RECORD_FIRST //
滚动到记录集的第一个记录ID_RECORD_LAST //
滚动到记录集的最后一个记录ID_RECORD_NEXT //
前进一个记录ID_RECORD_PREV //
后退一个记录
CRecordView提供了OnMove成员函数处理这四个命令消息,OnMove函数对用户是透明的,清单10.4列出了OnMove的源代码.
清单10.4 OnMove函数
BOOL CRecordView::OnMove(UINT nIDMoveCommand)
{
CRecordset* pSet = OnGetRecordset();
if (pSet->CanUpdate())
{
pSet->Edit();
if (!UpdateData())
return TRUE;
pSet->Update();
}
switch (nIDMoveCommand)
{
case ID_RECORD_PREV:
pSet->MovePrev();
if (!pSet->IsBOF())
break;
case ID_RECORD_FIRST:
pSet->MoveFirst();
break;
case ID_RECORD_NEXT:
pSet->MoveNext();
if (!pSet->IsEOF())
break;
if (!pSet->CanScroll())
{
// clear out screen since we're sitting on EOF
pSet->SetFieldNull(NULL);
break;
}
case ID_RECORD_LAST:
pSet->MoveLast();
break;
default:
// Unexpected case value
ASSERT(FALSE);
}
// Show results of move operation
UpdateData(FALSE);
return TRUE;
}
在函数的开头先调用CRecordset::Edit进入编辑模式,接着调用UpdateData将控件中的数据更新到记录集对象的域数据成员中,然后调用CRecordset::Update将域数据成员的值写入数据源.这说明OnMove在滚动记录的同时会完成对原来记录的修改.
在函数的中间有一个分支语句用来处理四个不同的命令,在这个分支语句中调用了CRecordset的各种用于滚动记录的成员函数,这些函数在滚动到一个新的记录时会把该记录的内容设置到域数据成员中.在函数的末尾调用UpdateData(FALSE)把新的当前记录的内容设置到表单的控件中。
由此可见,OnMove一来一回完成了两次表单控件和数据源的数据交换过程.通过分析该函数,读者可以学会在浏览记录时如何控制DDX和DFX数据交换.
- 06CRecordView类
- 一个在vs2005+上创建一个基于CRecordView的对话框
- 06-抽象(类)
- 06 类封装
- 《C++》06 C++ 存储类
- 06-21手机的类
- Java基础06集合类
- 06-面向对象(抽象类-特点) 06-面向对象(抽象类-特点)2 06-面向对象(抽象类-特点)3
- 数据持久层(06)_PersistentCriteria 类层次
- C#学习笔记06:类继承
- BackBone 学习笔记 06 库函数Utility类
- JavaSE(06)(StringBuffer类总结)
- 06、类的导出和使用
- JavaSE--06--String类的理解
- 06
- 06
- 06
- 06
- Internet Explorer 6 Service Pack 1 累积安全更新程序 - Windows XP, Windows 2000 (KB889293)
- 设计模式-建造模式(一碗牛肉面的制造过程)
- Using ODBC Connection Pooling with CDatabase (under MFC)
- 04CDatabase类
- 05CRecordset类
- 06CRecordView类
- 学习Enroll例程
- 01数据库、DBMS和SQL
- 02ODBC基本概念
- 03MFC的ODBC类简介
- 08 DAO
- 10.9 自动注册DSN和创建表
- DAO and MFC
- 在Oracle9i中如何自行编译BBED工具