问题如题: POSITION pos = ctl->GetFirstSelectedItemPosition();  //  执行完这句 后 得到的 值是 pos = 0x00000000 然后下面的操作就没法进行了! 这个是下断点的时候得到的值: 
NAME  |  VALUE ctl  |  0x00c92860 {CDemo02View hWnd=0x00040858} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
void CDemo02View::EditCurUser() 

//建立一个指针,用以操作ListCtrl 输出用户记录 
                                                                    //UpdateData( TRUE ); 
CListCtrl *ctl; 
ctl =&GetListCtrl(); //ctl = (CListCtrl*) GetDlgItem(IDD_USER_ADD_DLG);  //这个是看MSDN的的例子然后 套的 但是 执行的时候出错! 
        //ASSERT(ctl != NULL);     //assert(ctl->GetSafeHwnd() == NULL);                    //如果加这句就出现错误的提示框 
        POSITION pos = ctl->GetFirstSelectedItemPosition();  //0x00000000    就是这里pos的值总是为 0x00000000   
if( pos == NULL)                                //每次总跳到这句 

//如果没有选择记录 则提示并且退出 
AfxMessageBox( "请先选择一条记录!");          
return;                                            
} //获取当前记录的位置游标 
int m_CurUser = ctl->GetNextSelectedItem(pos); //创建一个 CUserDlg 的实例 CUserDlg m_UserDlg; 
//创建一个临时字符串来保存当前用户的信息 
char chrTemp[401] = {'\0'}; //初始化m_UserDlg的用户信息 ctl->GetItemText(m_CurUser, 1, chrTemp, sizeof(char[20])); 
m_UserDlg.m_UserName =chrTemp; ctl->GetItemText(m_CurUser, 2, chrTemp , sizeof(char[20])); 
m_UserDlg.m_UserPwd = chrTemp; ctl->GetItemText(m_CurUser, 3, chrTemp , sizeof(char[20])); 
m_UserDlg.m_UserAble = chrTemp; ctl->GetItemText(m_CurUser, 4, chrTemp , sizeof(char[8])); 
m_UserDlg.m_UserSex = chrTemp; ctl->GetItemText(m_CurUser, 5, chrTemp , sizeof(char[50])); 
m_UserDlg.m_UserAddr = chrTemp; ctl->GetItemText(m_CurUser, 6, chrTemp , sizeof(char[50])); 
m_UserDlg.m_UserDep = chrTemp; ctl->GetItemText(m_CurUser, 7, chrTemp , sizeof(char[20])); 
m_UserDlg.m_UserTitle = chrTemp; 
ctl->GetItemText(m_CurUser, 8, chrTemp , sizeof(char[50])); 
m_UserDlg.m_UserEmail = chrTemp; 
    
ctl->GetItemText(m_CurUser, 9, chrTemp , sizeof(char[20])); 
m_UserDlg.m_UserPhone = chrTemp; ctl->GetItemText(m_CurUser, 10, chrTemp , sizeof(char[50])); 
m_UserDlg.m_UserInfo = chrTemp; 
//将变量更新到对话框中 
    
//将变量内容更新到对话框中 并显示对话框 if(m_UserDlg.DoModal() != IDOK) 

return; 
} //如果选择了确定则进行数据库的更新 
//取得用户的ID ctl->GetItemText(m_CurUser,0 , chrTemp, sizeof(char[20])); 
//将用户ID转换成整数后保存 
int  m_CurUserID = atoi(chrTemp); 
//创建 CUserRecordSet 的实例 
CUSerRecordSet  m_UserRecordSet;     try 

if (m_UserRecordSet.IsOpen()) 

m_UserRecordSet.Close(); 

//输入匹配的条件UserId =m_CuruserID 
m_UserRecordSet.m_strFilter.Format("UserID %d order by UserID",m_CurUserID); 
m_UserRecordSet.Open(CRecordset::snapshot, NULL, CRecordset::none); //如果用户的记录存在,则进行修改操作 if (m_UserRecordSet.IsOpen() && !m_UserRecordSet.IsEOF()) 

//设置编辑当前记录 
m_UserRecordSet.Edit(); m_UserRecordSet.m_UserAble = m_UserDlg.m_UserAble; 
m_UserRecordSet.m_UserAddr = m_UserDlg.m_UserAddr; 
m_UserRecordSet.m_UserDep = m_UserDlg.m_UserDep; 
m_UserRecordSet.m_UserEmail = m_UserDlg.m_UserEmail; 
m_UserRecordSet.m_UserInfo = m_UserDlg.m_UserInfo; 
m_UserRecordSet.m_UserName = m_UserDlg.m_UserName; 
m_UserRecordSet.m_UserPhone = m_UserDlg.m_UserPhone; 
m_UserRecordSet.m_UserPwd  = m_UserDlg.m_UserPwd; 
m_UserRecordSet.m_UserSex = m_UserDlg.m_UserSex; 
m_UserRecordSet.m_UserTitle = m_UserDlg.m_UserTitle; 
//如果可以更新则更新数据库 
if (m_UserRecordSet.CanUpdate()) 

m_UserRecordSet.Update(); 

//关闭数据库 
if (m_UserRecordSet.IsOpen()) 

m_UserRecordSet.Close(); 

            //提示用户 
AfxMessageBox("修改成功"); 
return; } 
//考虑特例 操作中用户的信息不存在了 
else 

//关闭数据库 
if (m_UserRecordSet.IsOpen()) 

m_UserRecordSet.Close(); 

            //提示用户 
AfxMessageBox("该记录不存在!"); 
return; } } 
catch(CDBException *e) 

e->ReportError(); 
//e->Delete(); 
        return; 

    

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
为什么会这样呢? 
怎么解决?希望有具体点的操作建议,最好是有个范例  (偶是新手,呵呵) 
谢谢!~!!! 
有人说要在ListCtrl中选数据?
这个又怎么操作?
~~~~~~~~~~~~~~~~~~

解决方案 »

  1.   

    你在ListCtrl中选中几行,再执行这啊
      

  2.   

    int nIndex = 0;
        //选中
        ctl->SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);这个之后 pos 变成了0xcccccccc
      

  3.   

    ctl = (CListCtrl*) GetDlgItem(IDD_USER_ADD_DLG); 
    IDD_USER_ADD_DLG 是你对应的ListCtrl 控件ID吗?
      

  4.   

    你这个同志比较有趣,你先说一下想干嘛再来分析这么干对不对,何老师说得很对啊,如果你本来就没有选择项目,或者你调用这个函数的时候选择项失效,那么GetFirstSelectedItemPosition返回0也很正常。
      

  5.   

    CListCtrl *ctl; 
    ctl =&GetListCtrl(); //ctl = (CListCtrl*) GetDlgItem(IDD_USER_ADD_DLG);  //这个是看MSDN的的例子然后 套的 但是 执行的时候出错! 
    //ASSERT(ctl != NULL); 
    //assert(ctl->GetSafeHwnd() == NULL);                    //如果加这句就出现错误的提示框 
    POSITION pos = ctl->GetFirstSelectedItemPosition();  //0x00000000    就是这里pos的值总是为 0x00000000 你看你最前面这写的,ctl =&GetListCtrl();根本就没跟list控件关联嘛,你看看你list的资源ID号是不是对的呀
    CListCtrl *ctl = (CListCtrl*) GetDlgItem(IDD_LISTCTRL1);  
      

  6.   


    要实现MAINFRAME 上点击一个menu item(修改用户信息)之后进行修改!
    和这个程序链接的数据的表里面已经创建有相关user的信息了但是POSITION pos = ctl->GetFirstSelectedItemPosition(); 
    感觉是 找不到表里面的项的位置
      

  7.   


    要实现的是修改功能因为修改的界面和增加的界面使用的同样 所以这里 调用要调用前面已经做好的增加的DLG来实现修改这个类的基类是CListView
      

  8.   

    先用GetSelectedCount( )判断一下是否有item被选择。