我想在CLIstCtrl里单击空白的行时,让另外的2个按钮禁用。响应了LVM_ITEMCHANGED这个消息。但是没有达到我需要的效果。
最好要怎么做呢?void CPage1::OnItemchangedListUser(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if (m_userListSelRow>m_userList.GetItemCount())
{
m_btUserModify.EnableWindow(FALSE);
m_btUserDel.EnableWindow(FALSE);
}
*pResult = 0;
}还有,我有一个CNewUser类来增加一个用户,然后在修改用户的时候我还是想用这个类来修改数据。
我应该在怎么读出改用户的数据,然后把他放在响应的编辑框里?
在线等。

解决方案 »

  1.   

    第二个问题简单点就是说怎么动态的在dlg.domodal后在EditBox里填入数据?
      

  2.   


    这样子为什么不行呢if(dlg.DoModal()==IDOK)
    {...数据库取得数据
       dlg.m_strUserName=(TCHAR *)(_bstr_t)vtname;
       dlg.m_dPri=vtpri.intVal;
       dlg.m_strIdentity=(TCHAR *)(_bstr_t)vtiden;
       dlg.UpdateData(FALSE);
    }
      

  3.   

    1.跟踪一下看看有没有执行到里面的两句disable
    2.用SetDlgItemText试试
      

  4.   

    对于第一个问题,你参考一下我曾经做过的东西的一段代码,和你实现的功能挺像的
    void CYYGSGLDlg::OnItemchangedYygsglList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    int nIndex=m_listYYGSGL.GetNextItem(-1,LVNI_SELECTED);
    if (nIndex==-1)
      {
      return;
      }
      UpdateData(TRUE);
    m_strGSBH=m_listYYGSGL.GetItemText(nIndex,1);
    m_strGSMC=m_listYYGSGL.GetItemText(nIndex,2);
    m_strZCDZ=m_listYYGSGL.GetItemText(nIndex,3);
    m_strSSGS=m_listYYGSGL.GetItemText(nIndex,4);
    m_strGSFR=m_listYYGSGL.GetItemText(nIndex,5);
    m_strLXFS=m_listYYGSGL.GetItemText(nIndex,6);
    m_strZCZJ=m_listYYGSGL.GetItemText(nIndex,7);
    m_strQTXX=m_listYYGSGL.GetItemText(nIndex,8);
      UpdateData(FALSE);
    *pResult = 0;
    }
      

  5.   

       if (m_userListSelRow>m_userList.GetItemCount())
    你应该在这一句设置断点,调试一下
      

  6.   

    void CPage1::OnItemchangedListUser(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
        // TODO: Add your control notification handler code here
        if ( pNMListView->iItem == -1 )
        {
            m_btUserModify.EnableWindow(FALSE);
            m_btUserDel.EnableWindow(FALSE);
        }
        *pResult = 0;
    }GetItemCount() 返回的是所有的项目,不是所有选中的项目.
      

  7.   

    响应 NM_CLICK 消息
    void CTest1View::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
        if (pNMLV->iItem == -1 )
        {
            m_btUserModify.EnableWindow(FALSE);
            m_btUserDel.EnableWindow(FALSE);
        }
    *pResult = 0;
    }
      

  8.   

    恩。我就是想点击没有数据内容的列的时候让原来选中的颜色恢复到未选中状态。。
    谢谢楼上各位
    我先看看你们的意见试一试第二个问题,我想了想,我重载了一个构造函数,里面的三个成员变量是我在对话框资源里加进去的与控件相关联的变量。
    CNewUSer::CNewUSer(CString name,int pri,CString identity)
    {
    m_strUserName=name;
    m_dPri=pri;
    m_strIdentity=identity;
    }
    这里初始化了以后我在修改用户的按钮响应函数中得到变量strname,pri,strident(确实得到的),但在domodal的时候
    出错终止了。这个想法能实现吗?有什么问题?
    CNewUSer dlg(strname,pri,strident);
    dlg.SetTitle("修改用户");
    dlg.DoModal();
      

  9.   


    如果是常规变量可以在DoModule前修改dlg.m_abc=abc;
    dlg.DoModule();如果是控件变量,则Dlg类添加几个常规变量,在DoModule前传进来,然后在Dlg的OnInitDialog 函数里初始化比如:SetWindowText/UpdateData(FALSE)/ .....
      

  10.   

    ...数据库取得数据
       dlg.m_strUserName=(TCHAR *)(_bstr_t)vtname;
       dlg.m_dPri=vtpri.intVal;
       dlg.m_strIdentity=(TCHAR *)(_bstr_t)vtiden;
    if(dlg.DoModal()==IDOK){
       ...写入数据库
    }
    CXXXDialog::OnInitDialog()
    {
      .....
      UpdateData(FALSE);
      return TRUE;
    }
      

  11.   

    非常感谢joephia。第二个问题解决了。
    我问下我在9楼那样子做为什么会有问题?
      

  12.   

    OnItemchangedListUser这个响应函数
    按12楼的兄弟的方法调了下,我点击list剩下的、没有数据的行是不会响应这个函数的。
    有没有谁知道这第一个问题怎么解决啊?
      

  13.   

    参看下面文章:
    http://www.joyvc.cn/GuiAndWindows/GuiAndWindowsGroup00181.html
      

  14.   


    dlg 在DoModal时创建窗口的,在此前系统并没有分配HWND 句柄给Dlg.
    而SetTitle则会验证窗口句柄,所以会失败
      

  15.   

    又有个问题
    if(dlg.DoModal()==IDOK)这之后写数据库的话,domodal里执行的还是之前“新建用户”的idok。
    我可以让它做我的修改用户的idok吗?还是我一定得新建个修改用户的对话框啊?
    解决了这个问题就结贴吧