您的位置:首页 > 数据库

MFC树控件与列表视图控件的响应和数据库记录在列表视图的显示

2018-01-14 17:24 597 查看
voidCLostAndFoundView::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_TREEVIEW*pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    //TODO: Add your control notification handler code here
HTREEITEM selItem =m_treeInfo.GetSelectedItem();
    if(selItem== m_treeInfo.GetRootItem())
        return;
    DWORDm = m_treeInfo.GetItemData(selItem);
    CStringstrSQL(_T("select [物品名称],[物品数量],[发现人],[登记时间] from [用户及物品信息表] where 物品种类='0'"));
    CStringstrSQL2(_T("select [物品名称],[物品数量],[发现人],[登记时间] from [用户及物品信息表] where 物品种类='1'"));
    CStringstrSQL3(_T("select [物品名称],[物品数量],[发现人],[登记时间] from [用户及物品信息表] where 物品种类='2'"));
    CStringstrSQL4(_T("select [物品名称],[物品数量],[发现人],[登记时间] from [用户及物品信息表] where 物品种类='3'"));
    switch(m)
    {
    case0:
        m_listInfo.DeleteAllItems();
        while(m_listInfo.DeleteColumn(0));
        UpdateWindow();
        if(!ShowInformation(strSQL))
            AfxMessageBox("数据获取失败!");
        break;
    case1:
        m_listInfo.DeleteAllItems();
        while(m_listInfo.DeleteColumn(0));
        UpdateWindow();
        if(!ShowInformation(strSQL2))
            AfxMessageBox("数据获取失败!");
        break;
    case2:
        m_listInfo.DeleteAllItems();
        while(m_listInfo.DeleteColumn(0));
        UpdateWindow();
        if(!ShowInformation(strSQL3))
            AfxMessageBox("数据获取失败!");
        break;
    case3:
        m_listInfo.DeleteAllItems();
        while(m_listInfo.DeleteColumn(0));
        UpdateWindow();
        if(!ShowInformation(strSQL4))
            AfxMessageBox("数据获取失败!");
        break;
    }
    *pResult= 0;
}
当点击树的不同结点时会执行OnSelectedTree()函数,单击树控件的分组结点时执行OnSelectedTree()函数。为不同的结点绑定不同的标记数据,依据不同的绑定数据进入不同的case分支,将相应的SQL语句传入ShowInformation()函数。

BOOLCLostAndFoundView::ShowInformation(CString strSQL)
{
    try{
        BeginWaitCursor();
        if(m_pSet->IsOpen())
            m_pSet->Close();m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
        if(m_pSet->IsEOF())
        {
            m_pSet->MoveLast();
            m_pSet->MoveFirst();
        }
        //获取结果集字段个数
        intnFieldCount = m_pSet->GetODBCFieldCount();

        CODBCFieldInfofieldinfo;
        for(int n = 0;n < nFieldCount;n++)
        {
            m_pSet->GetODBCFieldInfo(n,fieldinfo);
            intnWidth = m_listInfo.GetStringWidth(fieldinfo.m_strName) + 40;
            m_listInfo.InsertColumn(n,fieldinfo.m_strName,LVCFMT_CENTER,nWidth);
           
m_listInfo.SetExtendedStyle(LVS_EX_HEADERDRAGDROP);
        }//endfor
        //读取记录信息
        CStringstrValue;
        m_pSet->MoveFirst();
        intnCount = 0;
        while(!m_pSet->IsEOF())
        {
            m_listInfo.InsertItem(nCount,strValue);
            for(intj=0;j<nFieldCount;j++)
            {
                m_pSet->GetFieldValue(j,strValue);
                m_listInfo.SetItemText(nCount,j, strValue);
            }
            m_pSet->MoveNext();
            nCount++;
        }//end while
        EndWaitCursor();
    }//end try
    catch(CDBException*e){
        e->ReportError();
        EndWaitCursor();
        returnFALSE;
    }
    returnTRUE;
}
先判断记录集是否处于打开状态,如果为真则关闭。m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL),第一个参数表明使用该参数的默认参数,为CRecordset::dynaset,以动态集的形式打开数据库,strSQL是打开数据库时要执行的SQL语句,该语句用where控制条件从表中查询四个字段。打开后将记录定位到第一条记录上。m_listInfo.SetExtendedStyle(LVS_EX_HEADERDRAGDROP)设置列表视图的列的宽度是可以通过拖动来调整的。在这里其实不用try{}catch{}也是可以的,因为本人对于异常处理这一块学的不是很透彻,catch了之后也没有给出解决方法,除了不让程序崩溃之外并没有解决什么实际问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC