| |
VC++设计基于ODBC的数据库管理系统 |
|
时间: 2006-06-27 来自:天极开发 |
 |
|
3、CRecordView类
CRecordView(记录视图)是CFormView的派生类,它提供了一个表单视图来显示当前记录,用户可以通过表单视图显示、修改、添加和删除数据,用户一般需要创建一个CRecordView的派生类并在其对应的对话框模板中加入控件。
记录视图使用DDX数据交换机制在表单中的控件和记录集之间交换数据。在前面介绍的DDX都是在控件和控件父窗口的数据成员之间交换数据,而记录视图则是在控件和一个外部对象(CRecordset的派生类对象)之间交换数据,交换数据的代码是ClassWizard自动加入的。在后面的例子中,将向读者介绍用ClassWizard连接记录视图与记录集对象的方法.
CRecordView本身提供了对下面四个命令的支持:
CRecordView提供了OnMove()成员函数处理ID_RECORD_FIRST(滚动到记录集的第一个记录)、ID_RECORD_LAST(滚动到记录集的最后一个记录)、ID_RECORD_NEXT(前进一个记录)、ID_RECORD_PREV(后退一个记录)这四个命令消息,OnMove函数()对用户是透明的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数据交换。
|
|
|
|
|
|
|
|