工控编程吧
标题:
265上位机VC MFC使用ODBC在列表视图中删除记录
[打印本页]
作者:
qq263946146
时间:
2016-5-1 14:21
标题:
265上位机VC MFC使用ODBC在列表视图中删除记录
(, 下载次数: 1)
上传
点击文件名下载附件
265上位机VC MFC使用ODBC在列表视图中删除记录
功能展示
在列表视图中显示数据记录后,有时想针对某一数据进行删除操作,我们当前例程就实现对指定记录的删除操作功能,效果如右图,双击想要删除的记录后,例程会提示用户是否确认删除,点击OK就删除被双击的记录;
要点提示
1.删除记录的一般方法为先调用CListCtrl类的GetSelectionMark()成员函数,此函数用来获取当前鼠标所处视图中记录的序号,如果鼠标所在位置没有记录条目 ,函数返回-1,由于视图反映了记录集,通过Crecordset的Move()函数使记录集滚动到想要删除的记录上,再使用Crecordset类的成员函数Delete()执行删除;
2.注意在删除记录前记得调用Crecordset 类的成员函数MoveFirst()一次,不然可能会误删;
实现功能
1.新建一数据源再新建基于单文档的应用程序,记得视窗派生于CListView;
2.再用类向导新建一基于Crecordset的类CODBCSet,记得类型选择dynaset ;
在文档中类中添加此类的头文件#include “ODBCSet.h”及变量public:CODBCSetm_Set;在视窗中添加此类的头文件#include “ODBCSet.h”及变量public:CODBCSet *m_pSet; CListCtrl* m_List;
3.在视窗的构造函数中初始变化量,及析构函数中关闭记录集
CGkbc8View::CGkbc8View()
{
m_pSet=NULL;
m_List=&GetListCtrl();//获取列表视图控件
m_dwDefaultStyle|=LVS_REPORT;//以报表的格式显示
}
CGkbc8View::~CGkbc8View()
{
if(m_pSet->IsOpen())
m_pSet->Close();
}
复制代码
4.在文档类添加视窗头文件#include "gkbc8View.h"并在OnNewDocument()函数中初始化视窗类的变量m_pSet
BOOL CGkbc8Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
POSITION pos;
pos=GetFirstViewPosition();
CGkbc8View* pView =(CGkbc8View*)GetNextView(pos);
pView->m_pSet = &m_Set;
return TRUE;
}
复制代码
5.在视窗类的OnInitialUpdate()函数中实现数据表内容的全部显示
void CGkbc8View::OnInitialUpdate()
{
CListView::OnInitialUpdate();
m_pList->SetRedraw(true);
m_pList->DeleteAllItems();
if(m_pSet==NULL)
{
AfxMessageBox("还没有对记录集进行初始化");
return;
}
if(!m_pSet->IsOpen())
{
m_pSet->Open();//打开记录集
}
int i=0,j=0;
CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
LV_COLUMN m_Lc;//存储列信息的结构体
m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
//读取记录集的字段信息
for(i=0;i<m_pSet->m_nFields;i++)
{
m_pSet->GetODBCFieldInfo(i,DbFi);
m_Lc.iSubItem=i;
m_Lc.fmt=LVCFMT_CENTER;
m_Lc.cx=DbFi.m_strName.GetLength()*10+16;
m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
GetListCtrl().InsertColumn(i,&m_Lc);
}
//根据记录集的数据信息添加行
LV_ITEM m_item;//条目结构体对象
CString string;//字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_pSet->IsEOF())//记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_pSet->MoveFirst();//从第一个记录开始
复制代码
while(m_pSet->IsEOF()==0)//是否到达最后一个记录
{
m_item.mask=LVIF_TEXT;
m_item.iItem=i;
m_item.iSubItem=0;
m_pSet->GetFieldValue((short)0,string);
m_item.pszText=string.GetBuffer(string.GetLength());
m_pList->InsertItem(&m_item);//插入条目
//显示列数据
for(j=1;j<m_pSet->m_nFields;j++)
{
m_pSet->GetFieldValue((short)j,string);
m_pList->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_pSet->MoveNext();//下移记录
i++;
}
}
复制代码
6添加视窗类的鼠标双击函数,实现双击删除数据条目功能
void CGkbc8View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CListView::OnLButtonDblClk(nFlags, point);
if(m_pSet==NULL)
{
AfxMessageBox("还没有对记录集进行初始化");
return;
}
int nCurSel;//双击鼠标左键时,要显示的记录的序号
nCurSel=m_pList->GetSelectionMark();
m_pSet->MoveFirst();
if(nCurSel!=-1)
m_pSet->Move(nCurSel);
if(IDOK==MessageBox("真删?","",MB_OKCANCEL|MB_ICONWARNING) )
m_pSet->Delete();
m_pList->SetRedraw(true);
m_pList->DeleteAllItems();
复制代码
if(!m_pSet->IsOpen())
m_pSet->Open();//打开记录集
int i=0,j=0;
LV_ITEM m_item;//条目结构体对象
CString string;//字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_pSet->IsEOF())//记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_pSet->MoveFirst();//从第一个记录开始
while(m_pSet->IsEOF()==0)//是否到达最后一个记录
{
m_item.mask=LVIF_TEXT;
m_item.iItem=i;
m_item.iSubItem=0;
m_pSet->GetFieldValue((short)0,string);
m_item.pszText=string.GetBuffer(string.GetLength());
m_pList->InsertItem(&m_item);//插入条目
//显示列数据
for(j=1;j<m_pSet->m_nFields;j++)
{
m_pSet->GetFieldValue((short)j,string);
m_pList->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_pSet->MoveNext();//下移记录
i++;
}
}
复制代码
最后记录在stdafx.h头文件上包含数据库支持的头文件#include <afxdb.h>
我们来演示功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/8ce48afbe5e8fff099cb3140d77822c7/0/0/w_19rsuamzzt.swf-albumId=6383863509-tvId=6383863509-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4