VC6.0 MFC 列表框 列表控件 添加 修改 删除
写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧!
一、未卜先知
1、编译运行后,点击“学生档案信息”,界面如下图所示。


2、添加记录,如下图所示。

3、修改记录,如下图所示。

4、删除记录,如下图所示。

二、实现步骤
1、新建一个工程,如下图所示。


2、建立菜单,并给菜单做一个消息响应函数,如下图所示。


3、接下来在对话框中进行相应操作,具体步骤如下图所示。




4、建立类向导,取类名“CDlgStuInfo”,如下图所示。

5、接下来,我们通过编程添加一些数据。首先在CdlgStuInfo中右击添加消息响应句柄,如下图所示。

6、在OnInitDialog() 中添加代码,如下。
BOOL CDlgStuInfo::OnInitDialog()
{
CDialog::OnInitDialog();
DWORD dwStyle;
dwStyle = m_listCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_ONECLICKACTIVATE;
m_listCtrl.SetExtendedStyle(dwStyle);
return TRUE;
}
记得要把头文件:#include "DlgStuInfo.h"对话框类嵌入进去!
7、在OnMStuInfo()中添加代码,如下。
void CChapterView::OnMStuInfo()
{
CDlgStuInfo dlg_stuInfo;
dlg_stuInfo.DoModal();
}
8、此时,运行结果如下图所示。

9、在第6步的基础上,继续往OnInitDialog() 中添加代码,如下。
BOOL CDlgStuInfo::OnInitDialog()
{
CDialog::OnInitDialog();
DWORD dwStyle;
dwStyle = m_listCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_ONECLICKACTIVATE;
m_listCtrl.SetExtendedStyle(dwStyle);
m_listCtrl.InsertColumn(0,"学号",LVCFMT_CENTER,100);
m_listCtrl.InsertColumn(1,"姓名",LVCFMT_CENTER,100);
m_listCtrl.InsertColumn(2,"性别",LVCFMT_CENTER,100);
m_listCtrl.InsertColumn(3,"专业",LVCFMT_CENTER,100);
m_listCtrl.InsertColumn(4,"班级",LVCFMT_CENTER,100);
m_listCtrl.InsertItem(0,"0001");
m_listCtrl.SetItemText(0,1,"张三");
m_listCtrl.SetItemText(0,2,"男");
m_listCtrl.SetItemText(0,3,"电子信息");
m_listCtrl.SetItemText(0,4,"202001");
m_listCtrl.InsertItem(1,"0002");
m_listCtrl.SetItemText(1,1,"李丽");
m_listCtrl.SetItemText(1,2,"女");
m_listCtrl.SetItemText(1,3,"计算机");
m_listCtrl.SetItemText(1,4,"202002");
return TRUE;
}
10、新建一个对话框,具体如下图所示。


11、紧接着建立它所对应的类,如下图所示。

12、双击“添加记录”按钮,把“添加一条学生记录信息”这个对话框给调出来,如下图所示。

13、把“添加一条学生记录信息”对话框的头文件:#include "Dlg_StuInfoAppe.h"嵌入进来。然后在OnBTNAppe()中编程。
void CDlgStuInfo::OnBTNAppe()
{
CDlg_StuInfoAppe dlg_stuInfoAppe;
dlg_stuInfoAppe.DoModal();
}
14、接下来怎么把一条新的学生信息通过“添加一条学生记录信息”对话框加到上一个 “学生档案信息”对话框的列表中去,这是我们的目的。
15、在对应部分添加如下代码:
CString m_sNo,m_sName,m_sSex,m_sDept,m_sClass;

class CDlgStuInfo : public CDialog
{
public:
CDlgStuInfo(CWnd* pParent = NULL);
enum { IDD = IDD_DlgStuInfo };
CListCtrl m_listCtrl;
CString m_sNo,m_sName,m_sSex,m_sDept,m_sClass;
int m_listSelPos;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
virtual BOOL OnInitDialog();
afx_msg void OnBTNAppe();
afx_msg void OnBTNModi();
afx_msg void OnClickList1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnBTNDele();
DECLARE_MESSAGE_MAP()
};
16、点击“确定”按钮后接收添加的信息到上一个 (学生档案信息)对话框的列表中去,代码如下。
void CDlgStuInfo::OnBTNAppe()
{
CDlg_StuInfoAppe dlg_stuInfoAppe;
if(IDOK == dlg_stuInfoAppe.DoModal())
{
m_sNo = dlg_stuInfoAppe.m_sNo;
m_sName = dlg_stuInfoAppe.m_sName;
m_sSex = dlg_stuInfoAppe.m_sSex;
m_sDept = dlg_stuInfoAppe.m_sDept;
m_sClass = dlg_stuInfoAppe.m_sClass;
int pos;
pos = m_listCtrl.GetItemCount();
m_listCtrl.InsertItem(pos,m_sNo);
m_listCtrl.SetItemText(pos,1,m_sName);
m_listCtrl.SetItemText(pos,2,m_sSex);
m_listCtrl.SetItemText(pos,3,m_sDept);
m_listCtrl.SetItemText(pos,4,m_sClass);
}
}
17、双击“修改记录”按钮,把“修改记录信息”这个对话框给调出来(同12)。
18、把“修改记录信息”对话框的头文件:#include "Dlg_StuInfoModi.h"嵌入进来。然后在OnBTNModi()中编程(同13)。
void CDlgStuInfo::OnBTNModi()
{
CDlg_StuInfoModi dlg_stuInfoModi;
dlg_stuInfoModi.DoModal();
}
19、接下来怎么把 “修改记录信息”对话框中要修改的记录更新到上一个 “学生档案信息”对话框的列表中去,这是我们的目的(同14)。
20、我们回到IDD_DlgStuInfo对话框,选中对话框,右击选择“事件…”,在弹出的事件句柄中选择“NM_CLICK”,如下图所示。


void CDlgStuInfo::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
m_listSelPos = m_listCtrl.GetSelectionMark();
*pResult = 0;
}
21、添加代码如下(类似16)。
void CDlgStuInfo::OnBTNModi()
{
CDlg_StuInfoModi dlg_stuInfoModi;
dlg_stuInfoModi.m_sNo = m_listCtrl.GetItemText(m_listSelPos,0);
dlg_stuInfoModi.m_sName = m_listCtrl.GetItemText(m_listSelPos,1);
dlg_stuInfoModi.m_sSex = m_listCtrl.GetItemText(m_listSelPos,2);
dlg_stuInfoModi.m_sDept = m_listCtrl.GetItemText(m_listSelPos,3);
dlg_stuInfoModi.m_sClass = m_listCtrl.GetItemText(m_listSelPos,4);
if(IDOK == dlg_stuInfoModi.DoModal())
{
UpdateData(true);
m_listCtrl.SetItemText(m_listSelPos,0,dlg_stuInfoModi.m_sNo);
m_listCtrl.SetItemText(m_listSelPos,1,dlg_stuInfoModi.m_sName);
m_listCtrl.SetItemText(m_listSelPos,2,dlg_stuInfoModi.m_sSex);
m_listCtrl.SetItemText(m_listSelPos,3,dlg_stuInfoModi.m_sDept);
m_listCtrl.SetItemText(m_listSelPos,4,dlg_stuInfoModi.m_sClass);
}
}
22、“删除记录”类似,不再叙述。这里仅将该部分代码附上,如下。
void CDlgStuInfo::OnBTNDele()
{
CString str;
str.Format("确认删除第 %d 行",m_listSelPos + 1);
if(IDYES == AfxMessageBox(str,MB_YESNO|MB_ICONQUESTION))
{
m_listCtrl.DeleteItem(m_listSelPos);
}
}
三、执行结果
1、编译运行后,点击“学生档案信息”,界面如下图所示。


2、添加记录,如下图所示。

3、修改记录,如下图所示。

4、删除记录,如下图所示。
