3.8.1 设计员工模块(3)
(2) 双击对话框,创建一个新类CEmpInfoManageDlg,在头文件中定义变量及成员函数。头文件中相应的代码如下:
- class CEmpInfoManageDlg : public CDialog
- {
- public:
- CEmpInfoManageDlg(CWnd* pParent = NULL);
- HTREEITEM m_hParent;
//定义树形控件的句柄- HTREEITEM m_hSelect;
- _RecordsetPtr m_pRecordset; //定义记录集
- _RecordsetPtr m_pRecordset1;
- void ShowTreeData();
//显示树形控件的数据- void ShowListData(const CString& sql);
//显示列表控件的数据- int m_nSelect;
- int m_nID;
- }
通过上述代码为相关变量和成员函数定义,m_hParent与m_hSelect为属性控件的句柄,函数ShowTreeData( )与 ShowListData( )分别为将数据显示在树形控件和列表控件中。
(3) 通过类向导为控件添加相应的变量。并为对话框添加WM_INITDIALOG消息响应函数。OnInitDialog( )中的代码如下:
- BOOL CEmpInfoManageDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- m_pRecordset.CreateInstance("ADODB.Recordset");
- m_pRecordset1.CreateInstance("ADODB.Recordset");
//风格设定- m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES |
LVS_EX_FULLROWSELECT );- m_ListCrtl.InsertColumn(0, "ID", LVCFMT_CENTER,
40); //插入列标题- m_ListCrtl.InsertColumn(1, "员工名称", LVCFMT_CENTER, 60);
- m_ListCrtl.InsertColumn(2, "年龄", LVCFMT_CENTER, 40);
- m_ListCrtl.InsertColumn(3, "性别", LVCFMT_CENTER, 40);
- m_ListCrtl.InsertColumn(4, "籍贯", LVCFMT_CENTER, 120);
- m_ListCrtl.InsertColumn(5, "部门", LVCFMT_CENTER, 120);
- m_ListCrtl.InsertColumn(6, "出生日期", LVCFMT_CENTER, 100);
- m_ListCrtl.InsertColumn(7, "电话", LVCFMT_CENTER, 80);
- m_ListCrtl.InsertColumn(8, "备注", LVCFMT_CENTER, 200);
- ShowTreeData();
//显示数据- return TRUE;
- }
通过上述代码完成了一些初始化工作,函数SetExtendedStyle( )设置列表控件的风格,通过InsertColumn( )函数可以设置列表控件的列标题,包括标题的位置和列的宽度。
(4) 通过类向导为树形控件添加NM_DBLCLK消息响应函数。主要功能是通过双击树形控件,在列表控件中显示相应的数据,OnDblclkTree1中的代码如下:
- void CEmpInfoManageDlg::OnDblclkTree1(NMHDR*
pNMHDR, LRESULT* pResult)- {
- _variant_t va;
- CString strSQL;
- HTREEITEM hSelect;
- hSelect = m_TreeCrtl.GetSelectedItem();
//获取选中节点的索引- CString strName;
- if(hSelect != m_hParent)
//判断是否为根节点- {
- strName = m_TreeCrtl.GetItemText(hSelect);
//获取选中节点的文本- if(m_TreeCrtl.GetParentItem(hSelect) == m_hParent)
- //判断是否为子节点
- {
- strSQL.Format("select * from emp where
depart = '%s'", strName);- }
- else
- strSQL.Format("select * from emp where
name = '%s'", strName);- ShowListData(strSQL);
//显示数据- }
- *pResult = 0;
- }
因为树形控件中显示的信息包括员工的单位、部门和员工的信息三种,而员工的信息和部门的信息是分别放在数据库中的两个不同的表中。在这里通过单击节点的父节点就可以判断要查询的是哪一张表,从而构造不同的SQL语句来查询员工或者部门的信息。
(5) 通过类向导为列表控件添加LVN_ITEMCHANGED消息响应函数。OnItemchangedList1中的代码如下:
- void CEmpInfoManageDlg::OnItemchangedList1(NMHDR*
pNMHDR, LRESULT* pResult)- {
- NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
- int nSelect = pNMListView->iItem;
//获取选定的行号- theApp.m_strEmpID = m_ListCrtl.GetItemText
(nSelect,0); //获取选定的文本- *pResult = 0;
- }
(6) 设置索引,当前单击列表控件行的索引是pNMListView->iItem,该索引是从0开始的,这样可通过GetItemText()函数获取指定行列的字符串。自定义成员函数ShowTreeData()用来显示树形控件的数据,代码如下:
- void CEmpInfoManageDlg::ShowTreeData()
- {
- m_TreeCrtl.DeleteAllItems();
//删除所有的子项- HTREEITEM hItem;
//定义句柄- TVINSERTSTRUCT tvInsert;
//定义结构体- tvInsert.hParent = NULL;
- tvInsert.hInsertAfter = NULL;
- tvInsert.item.mask = TVIF_TEXT;
- tvInsert.item.pszText = _T("某单位");
//根节点的赋值- m_hParent = m_TreeCrtl.InsertItem(&tvInsert);
//插入根节点- _variant_t vName;
- CString strSQL;
//定义字符串变量- strSQL.Format("select [name] from dep");
- try
- {
- m_pRecordset = theApp.m_pConnection->Execute((_bstr_t)
- strSQL, NULL, adCmdText);
- while(!m_pRecordset->adoEOF)
//如果记录没有到末尾- {
- vName = m_pRecordset->GetCollect
(_variant_t((long)0));- //获取记录集第一列值
- hItem = m_TreeCrtl.InsertItem((char*)
_bstr_t(vName), m_hParent);- strSQL.Format("select name from emp");
- m_pRecordset1=theApp.m_pConnection->
- Execute((_bstr_t)strSQL,NULL,adCmdText);
//执行SQL语句- while(!m_pRecordset1->adoEOF)
//如果记录没有到末尾- {
- vName = m_pRecordset1->GetCollect
(_variant_t((long)0));- m_TreeCrtl.InsertItem((char*)_bstr_t(vName), hItem);
- m_pRecordset1->MoveNext();
- }
- m_pRecordset->MoveNext();
- }
- m_TreeCrtl.Expand(m_hParent,TVE_EXPAND);
//展开根节点- }
- CATCH_ERROR;
- }