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;
- }