分享
 
 
 

06CRecordView类

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

CRecordView类

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数据交换.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有