分类: C/C++
2008-08-01 16:53:37

//设表格表题和列的宽度
m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ListCtrl.InsertColumn(0,_T("学号"),LVCFMT_IMAGE|LVCFMT_LEFT);
m_ListCtrl.InsertColumn(1,_T("姓名"));
m_ListCtrl.InsertColumn(2,_T("数学"));
m_ListCtrl.InsertColumn(3,_T("英语"));
int j;
for(j=0;j<4;j )
{
m_ListCtrl.SetColumnWidth(j ,90);
}
这样列表题就设置好,同时设置列的宽度。还要特别注意的一点,要在List Control控件的属性页Styles中设report属性。因为程序一运行时,要求所有记录都显示出来所以接着增加了一个Show()函数,为了它的重用性,我对它进行了封装。在后面的程序中大家可以看到它的好处。Show()函数如下:int CLhwyView::Show()
{
int i=0;
m_pSet->MoveFirst();
do
{
CString s;
s.Format("%d",m_pSet->m_column1);
m_ListCtrl.InsertItem(i,s,0);
m_ListCtrl.SetItemText(i,1,m_pSet->m_column2);
s.Format("%d",m_pSet->m_column3);
m_ListCtrl.SetItemText(i,2,s);
s.Format("%d",m_pSet->m_column4);
m_ListCtrl.SetItemText(i,3,s);
i ;
m_pSet->MoveNext();
} while(!m_pSet->IsEOF());
m_pSet->MoveFirst();
return i;
}
这样整个程序初始化的工作就基本完成。因为数据库中域用的是汉字,所以记录集中出现了//增加记录
void CLhwyView::OnAdd()
{
// TODO: Add your control notification handler code here
CAddDialog dlg;
if( dlg.DoModal()==IDOK)
{
if(dlg.m_Xuehao==0)
{
AfxMessageBox("学号不可为零!");
}
else
{
m_pSet->AddNew();
m_pSet->m_column1=dlg.m_Xuehao;
m_pSet->m_column2=dlg.m_strName;
m_pSet->m_column3=dlg.m_Maths;
m_pSet->m_column4=dlg.m_English;
m_pSet->Update();
m_pSet->Requery();
m_pSet->MoveLast();
CString s;
s.Format("%d",dlg.m_Xuehao);
m_ListCtrl.InsertItem(0,s,0);
m_ListCtrl.SetItemText(0,1,dlg.m_strName);
s.Format("%d",dlg.m_Maths);
m_ListCtrl.SetItemText(0,2,s);
s.Format("%d",dlg.m_English);
m_ListCtrl.SetItemText(0,3,s);
}
}
m_pSet->MoveFirst();
}
//删除记录
void CLhwyView::OnDelect()
{
// TODO: Add your control notification handler code here
CDeleteDialog dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_Password!=1234)
AfxMessageBox("你没有权限删除记录!请重输入密码:");
else
{
BOOL b=FALSE;
m_pSet->MoveFirst();
do
{
if(dlg.m_Xuehao!=m_pSet->m_column1)
m_pSet->MoveNext();
else
{
m_ListCtrl.DeleteAllItems();
b=TRUE;
m_pSet->Delete();
m_pSet->Requery();
this->Show();
m_pSet->MoveFirst();
break;
}
}while(!m_pSet->IsEOF());
if(b==FALSE)
AfxMessageBox("没有此记录");
}
}
}
//查寻记录
void CLhwyView::OnFind()
{
// TODO: Add your control notification handler code here
BOOL k=FALSE;
CFindDialog dlg;
if(dlg.DoModal()==IDOK)
{
m_pSet->MoveFirst();
m_ListCtrl.DeleteAllItems();
do{
if(dlg.m_Maths!=m_pSet->m_column3)
m_pSet->MoveNext();
else
{
k=TRUE;
CString s;
s.Format("%d",m_pSet->m_column1);
m_ListCtrl.InsertItem(0,s);
m_ListCtrl.SetItemText(0,1,m_pSet->m_column2);
s.Format("%d",m_pSet->m_column3);
m_ListCtrl.SetItemText(0,2,s);
s.Format("%d",m_pSet->m_column3);
m_ListCtrl.SetItemText(0,3,s);
m_pSet->MoveNext();
}
} while(!m_pSet->IsEOF());
if(k==FALSE)
AfxMessageBox("没有符和条件的记录");
}
}
//修改记录
void CLhwyView::OnEdit()
{
// TODO: Add your control notification handler code here
CEditDialog dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_Password!=1234)
AfxMessageBox("你没有权限更改记录!请重输入密码:");
else
{
BOOL b=FALSE;
m_pSet->MoveFirst();
do
{
if(dlg.m_Xuehao!=m_pSet->m_column1)
m_pSet->MoveNext();
else
{
m_ListCtrl.DeleteAllItems();
m_pSet->Edit();
b=TRUE;
m_pSet->m_column1=dlg.m_Xuehao;
m_pSet->m_column2=dlg.m_strName;
m_pSet->m_column3=dlg.m_Maths;
m_pSet->m_column4=dlg.m_English;
m_pSet->Update();
m_pSet->Requery();
this->Show();
m_pSet->MoveFirst();
break;
}
}while(!m_pSet->IsEOF());
if(b==FALSE)
AfxMessageBox("没有此记录");
}
}
}
//取全部记录
void CLhwyView::OnAll()
{
m_ListCtrl.DeleteAllItems();
this->Show();
}
//排序记录
void CLhwyView::OnSort()
{
m_ListCtrl.DeleteAllItems();
m_pSet->m_strSort="[学号]";
m_pSet->Requery();
this->Show();
}
因为在查寻记录后,有时需要看所有记录。所以增加了一个onAll()函数用来显示所有记录。在修改记录和删除记录中设置密码(1234)必需加以确认。这样整个程序就大致完成。
CString CLhwySet::GetDefaultConnect()
{ //注册说明
return _T("ODBC;DSN=not"); //在注册数据源库时,数据源名取not。当然也可换名,
} //但程序中的not也换成同样的名
CString CLhwySet::GetDefaultSQL()
{
return _T("[fen]"); //表名,选fen表
}
假如您从方便用户的角度考虑,可以采用在程序中动态创建数据源,请参考VC知识库中的这篇文章《用Visual
C 程序实现设置ODBC数据源 》