我想在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类来增加一个用户,然后在修改用户的时候我还是想用这个类来修改数据。
我应该在怎么读出改用户的数据,然后把他放在响应的编辑框里?
在线等。
最好要怎么做呢?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类来增加一个用户,然后在修改用户的时候我还是想用这个类来修改数据。
我应该在怎么读出改用户的数据,然后把他放在响应的编辑框里?
在线等。
这样子为什么不行呢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);
}
2.用SetDlgItemText试试
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;
}
你应该在这一句设置断点,调试一下
{
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() 返回的是所有的项目,不是所有选中的项目.
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;
}
谢谢楼上各位
我先看看你们的意见试一试第二个问题,我想了想,我重载了一个构造函数,里面的三个成员变量是我在对话框资源里加进去的与控件相关联的变量。
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();
如果是常规变量可以在DoModule前修改dlg.m_abc=abc;
dlg.DoModule();如果是控件变量,则Dlg类添加几个常规变量,在DoModule前传进来,然后在Dlg的OnInitDialog 函数里初始化比如:SetWindowText/UpdateData(FALSE)/ .....
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;
}
我问下我在9楼那样子做为什么会有问题?
按12楼的兄弟的方法调了下,我点击list剩下的、没有数据的行是不会响应这个函数的。
有没有谁知道这第一个问题怎么解决啊?
http://www.joyvc.cn/GuiAndWindows/GuiAndWindowsGroup00181.html
dlg 在DoModal时创建窗口的,在此前系统并没有分配HWND 句柄给Dlg.
而SetTitle则会验证窗口句柄,所以会失败
if(dlg.DoModal()==IDOK)这之后写数据库的话,domodal里执行的还是之前“新建用户”的idok。
我可以让它做我的修改用户的idok吗?还是我一定得新建个修改用户的对话框啊?
解决了这个问题就结贴吧