06CRecordView类
CRecordView(記錄視圖)是CFormView的派生類,它提供了一個(gè)表單視圖(參見6.4.1)來(lái)顯示當(dāng)前記錄.一個(gè)典型的記錄視圖如圖10.3所示,用戶可以通過(guò)表單視圖顯示當(dāng)前記錄.通過(guò)記錄視圖,可以修改、添加和刪除數(shù)據(jù).用戶一般需要?jiǎng)?chuàng)建一個(gè)CRecordView的派生類并在其對(duì)應(yīng)的對(duì)話框模板中加入控件.
圖10.3 典型的記錄視圖
記錄視圖使用DDX數(shù)據(jù)交換機(jī)制在表單中的控件和記錄集之間交換數(shù)據(jù)。在前面介紹的DDX都是在控件和控件父窗口的數(shù)據(jù)成員之間交換數(shù)據(jù),而記錄視圖則是在控件和一個(gè)外部對(duì)象(CRecordset的派生類對(duì)象)之間交換數(shù)據(jù).清單10.3顯示了一個(gè)CRecordView的派生類的DoDataExchange函數(shù),讀者可以看出,該函數(shù)是與m_pSet指針指向的記錄集對(duì)象的域數(shù)據(jù)成員交換數(shù)據(jù)的,而且,交換數(shù)據(jù)的代碼是ClassWizard自動(dòng)加入的.在后面的例子中,將向讀者介紹用ClassWizard連接記錄視圖與記錄集對(duì)象的方法.
清單10.3 用來(lái)與記錄集對(duì)象的域數(shù)據(jù)成員交換數(shù)據(jù)的DoDataExchange函數(shù)
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
}
作為總結(jié),圖10.4顯示了MFC的ODBC應(yīng)用程序中的DDX和RFX數(shù)據(jù)交換.
圖10.4 DDX和RFX數(shù)據(jù)交換機(jī)制
CRecordView本身提供了對(duì)下面四個(gè)命令的支持:
ID_RECORD_FIRST //滾動(dòng)到記錄集的第一個(gè)記錄
ID_RECORD_LAST //滾動(dòng)到記錄集的最后一個(gè)記錄
ID_RECORD_NEXT //前進(jìn)一個(gè)記錄
ID_RECORD_PREV //后退一個(gè)記錄
CRecordView提供了OnMove成員函數(shù)處理這四個(gè)命令消息,OnMove函數(shù)對(duì)用戶是透明的,清單10.4列出了OnMove的源代碼.
清單10.4 OnMove函數(shù)
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;
}
在函數(shù)的開頭先調(diào)用CRecordset::Edit進(jìn)入編輯模式,接著調(diào)用UpdateData將控件中的數(shù)據(jù)更新到記錄集對(duì)象的域數(shù)據(jù)成員中,然后調(diào)用CRecordset::Update將域數(shù)據(jù)成員的值寫入數(shù)據(jù)源.這說(shuō)明OnMove在滾動(dòng)記錄的同時(shí)會(huì)完成對(duì)原來(lái)記錄的修改.
在函數(shù)的中間有一個(gè)分支語(yǔ)句用來(lái)處理四個(gè)不同的命令,在這個(gè)分支語(yǔ)句中調(diào)用了CRecordset的各種用于滾動(dòng)記錄的成員函數(shù),這些函數(shù)在滾動(dòng)到一個(gè)新的記錄時(shí)會(huì)把該記錄的內(nèi)容設(shè)置到域數(shù)據(jù)成員中.在函數(shù)的末尾調(diào)用UpdateData(FALSE)把新的當(dāng)前記錄的內(nèi)容設(shè)置到表單的控件中。
由此可見,OnMove一來(lái)一回完成了兩次表單控件和數(shù)據(jù)源的數(shù)據(jù)交換過(guò)程.通過(guò)分析該函數(shù),讀者可以學(xué)會(huì)在瀏覽記錄時(shí)如何控制DDX和DFX數(shù)據(jù)交換.
總結(jié)
以上是生活随笔為你收集整理的06CRecordView类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 十三、“词短情长书不尽,桃花潭水是我心。
- 下一篇: 十四、“沥沥雨丝如落泪,麻麻密密总为愁。