4.5.4 职工删除的实现
上一节介绍了职工信息添加的实现,本节将介绍职工删除的实现。添加一个对话框资源ID为IDD_EMPINFO_MANAGE_DLG,添加如图4-24所示的控件。
|
| (点击查看大图)图4-24 职工基本信息管理界面设计 |
双击对话框为对话框创建一个新类CEmpInfoManageDlg,在头文件中定义变量及成员函数。头文件中相应的代码如下:
代码位置:见光盘中本章源代码的CEmpInfoManageDlg类。
- 1 class CEmpInfoManageDlg : public CDialog
- 2 {
- 3 public:
- 4 CEmpInfoManageDlg(CWnd* pParent = NULL);
- 5 HTREEITEM m_hParent; //定义树形控件的句柄
- 6 HTREEITEM m_hSelect;
- 7 _RecordsetPtr m_pRecordset; //定义记录集
- 8 _RecordsetPtr m_pRecordset1;
- 9 void ShowTreeData(); //显示树形控件的数据
- 10 void ShowListData(const CString& sql); //显示列表控件的数据
- 11 int m_nSelect;
- 12 int m_nID;
- 13 .......
- 14 }
第4~5行代码为树形控件句柄的定义,为向树形控件插入数据做准备工作。
第9~10行代码为定义用户自定义函数,显示树形控件和列表控件的数据。
上述代码为相关变量和成员函数的定义,m_hParent与m_hSelect为属性控件的句柄,函数ShowTreeData()与ShowListData()分别为将数据显示在树形控件和列表控件中。
通过类向导为控件添加相应的变量。并为对话框添加WM_INITDIALOG消息响应函数。OnInitDialog()中的代码如下:
代码位置:见光盘中本章源代码的CEmpInfoManageDlg类。
- 1 BOOL CEmpInfoManageDlg::OnInitDialog()
- 2 {
- 3 CDialog::OnInitDialog();
- 4 m_pRecordset.CreateInstance("ADODB.Recordset");
- 5 m_pRecordset1.CreateInstance("ADODB.Recordset"); //风格设定
- 6 m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
- 7 m_ListCrtl.InsertColumn(0, "ID", LVCFMT_CENTER, 40); //插入列标题
- 8 m_ListCrtl.InsertColumn(1, "员工名称", LVCFMT_CENTER, 60);
- 9 m_ListCrtl.InsertColumn(2, "年龄", LVCFMT_CENTER, 40);
- 10 m_ListCrtl.InsertColumn(3, "性别", LVCFMT_CENTER, 40);
- 11 m_ListCrtl.InsertColumn(4, "籍贯", LVCFMT_CENTER, 120);
- 12 m_ListCrtl.InsertColumn(5, "部门", LVCFMT_CENTER, 120);
- 13 m_ListCrtl.InsertColumn(6, "出生日期", LVCFMT_CENTER, 100);
- 14 m_ListCrtl.InsertColumn(7, "电话", LVCFMT_CENTER, 80);
- 15 m_ListCrtl.InsertColumn(8, "备注", LVCFMT_CENTER, 200);
- 16 ShowTreeData(); //显示数据
- 17 return TRUE;
- 18 }
第4~5行代码为创建记录集的实例。
第6~15行代码为列表控件的初始化工作。
上述代码完成一些初始化工作,函数SetExtendedStyle()设置列表控件的风格,通过InsertColumn()函数可以设置列表控件的列标题,标题的位置和列的宽度。
通过类向导为树形控件添加NM_DBLCLK消息响应函数。主要功能是通过双击树形控件,在列表控件中显示相应的数据,OnDblclkTree1中代码如下:
代码位置:见光盘中本章源代码的CEmpInfoManageDlg类。
- 1 void CEmpInfoManageDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult)
- 2 {
- 3 _variant_t va;
- 4 CString strSQL;
- 5 HTREEITEM hSelect;
- 6 hSelect = m_TreeCrtl.GetSelectedItem(); //获取选中节点的索引
- 7 CString strName;
- 8 if(hSelect != m_hParent) //判断是否为根节点
- 9 {
- 10 strName = m_TreeCrtl.GetItemText(hSelect); //获取选中节点的文本
- 11 if(m_TreeCrtl.GetParentItem(hSelect) == m_hParent) //判断是否为子节点
- 12 {
- 13 strSQL.Format("select * from emp where depart = '%s'", strName);
- 14 }
- 15 else
- 16 strSQL.Format("select * from emp where name = '%s'", strName);
- 17 ShowListData(strSQL); //显示数据
- 18 }
- 19 *pResult = 0;
- 20 }
第4~6行代码为获取选中树形控件的文本。
第8~18行代码实现了构造从不同表中查询数据的SQL语句。
由于树形控件中显示的信息包括职工的单位、部门和职工三种信息,而职工的信息和部门的信息是分别放在数据库中的两个不同的表中。在这里通过单击节点的父节点就可以判断要查询的是哪一张表,从而构造不同的SQL语句来查询职工或者部门的信息。
通过类向导为列表控件添加LVN_ITEMCHANGED消息响应函数。OnItemchangedList1中代码如下:
代码位置:见光盘中本章源代码的CEmpInfoManageDlg类。
- 1 void CEmpInfoManageDlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
- 2 {
- 3 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
- 4 int nSelect = pNMListView->iItem; //获取选定的行号
- 5 theApp.m_strEmpID = m_ListCrtl.GetItemText(nSelect,0); //获取选定的文本
- 6 *pResult = 0;
- 7 }
第4~5行代码实现了获取选中列表控件行的第一列的文本。
pNMListView->iItem为当前单击列表控件行的索引,该索引是从0开始的,这样可通过GetItemText()函数获取指定行列的字符串。自定义成员函数ShowTreeData()用来显示树形控件的数据,代码如下:
代码位置:见光盘中本章源代码的CEmpInfoManageDlg类。
- 1 void CEmpInfoManageDlg::ShowTreeData()
- 2 {
- 3 m_TreeCrtl.DeleteAllItems(); //删除所有的子项
- 4 HTREEITEM hItem; //定义句柄
- 5 TVINSERTSTRUCT tvInsert; //定义结构体
- 6 tvInsert.hParent = NULL;
- 7 tvInsert.hInsertAfter = NULL;
- 8 tvInsert.item.mask = TVIF_TEXT;
- 9 tvInsert.item.pszText = _T("某单位"); //根节点的赋值
- 10 m_hParent = m_TreeCrtl.InsertItem(&tvInsert); //插入根节点
- 11 _variant_t vName;
- 12 CString strSQL; //定义字符串变量
- 13 strSQL.Format("select [name] from dep");
- 14 try
- 15 {
- 16 m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)
strSQL, NULL, adCmdText); - 17 while(!m_pRecordset->adoEOF) //如果记录没有到末尾
- 18 {
- 19 vName = m_pRecordset->GetCollect(_variant_t((long)0));
//获取记录集第一列值 - 20 hItem = m_TreeCrtl.InsertItem((char*)_bstr_t(vName), m_hParent);
- 21 strSQL.Format("select name from emp");
- 22 m_pRecordset1=theApp.m_pConnection->
- 23 Execute((_bstr_t)strSQL,NULL,adCmdText); //执行SQL语句
- 24 while(!m_pRecordset1->adoEOF) //如果记录没有到末尾
- 25 {
- 26 vName = m_pRecordset1->GetCollect(_variant_t((long)0));
- 27 m_TreeCrtl.InsertItem((char*)_bstr_t(vName), hItem);
- 28 m_pRecordset1->MoveNext();
- 29 }
- 30 m_pRecordset->MoveNext();
- 31 }
- 32 m_TreeCrtl.Expand(m_hParent,TVE_EXPAND); //展开根节点
- 33 }
- 34 CATCH_ERROR;
- 35 }
第4~9行代码实现了树形控件根节点的设置。
第12~33行代码实现了从数据库中读取数据插入到树形控件中。
由于树形控件中需要显示部门信息又要显示职工信息,而职工信息是根据部门来划分的,所以在这里使用了两层的循环语句。第一个whlie循环读取部门信息,根据读取到的部门信息再遍历记录集读取相应的职工信息。双击【删除】按钮添加消息响应函数,实现职工信息的删除,代码如下:
代码位置:见光盘中本章源代码的CEmpInfoManageDlg类。
- 1 void CEmpInfoManageDlg::OnDel()
- 2 {
- 3 if(theApp.m_strEmpID == "") //职工编号不能为空
- 4 {
- 5 MessageBox("请选择一条信息!"); //信息提示
- 6 return ;
- 7 }
- 8 CString strSQL; //定义字符串变量
- 9 strSQL.Format("delete from emp where id = %s", theApp.m_strEmpID);
- 10 if(MessageBox("确定删除吗?", "注意", MB_YESNO) == IDYES) //消息提示
- 11 {
- 12 try
- 13 {
- 14 theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);
- 15 MessageBox("删除成功!");
- 16 ShowTreeData();
- 17 m_ListCrtl.DeleteAllItems();
- 18 }
- 19 CATCH_ERROR;
- 20 }
- 21 }
第3~7行代码为删除数据的条件判断。
第8~19行代码为执行SQL语句从数据库中删除数据。
上述代码中读者要注意MessageBox()函数的另一种使用方法,根据提示的信息进行操作。借助Format()函数,使用了"delete from 表名 where"完成了从表中删除数据操作SQL语句的构造,通过Execute()函数执行SQL语句。
【责任编辑:
云霞 TEL:(010)68476606】