比如有两个对话框:dlg1,dlg2;
在dlg1中通过按钮控件调用dlg2;
在dlg2中有一个列表框控件其对应的变量为m_ctrListBox,并已经通过列表框控件m_ctrListBox的AddString成员函数向其中添加了一些CString字符串.
问题:在dlg1中是否可以通过调用dlg2中m_ctrListBox的成员函数来获取列表框控件中的字符串;下面的代码可以通过编译连接
但运行时有错误,错误主要在dlg2.m_ctrListBox.GetText(item,str);这一句dlg2.m_ctrListBox.GetCount()也因该有问题!
那么有没有其他的方法可以实现(主要是通过列表框控件的成员函数等)void dlg1::OnButton1() 
{
// TODO: Add your control notification handler code here
UpdateData();
CValueDlg dlg2;
CString str;
vector<CString> VectorString;
if(IDOK == dlg2.DoModal())
{
for(int Item = 0;Item < dlg.m_ctrListBox.GetCount();Item++)
{
dlg2.m_ctrListBox.GetText(Item,str);
VectorString.push_back(str);
}
}
}补充:dlg2中列表框控件对应变量的类型为CListBox;

解决方案 »

  1.   

    1)LZ的dlg2是一个栈变量,IDOK==dlg2.DoModal()已经释放了dlg2,所以再调用肯定会出错了。
    建立LZ使用一个全局的vector <CString > VectorString; 在dlg2中把这个值初始化,然后在dlg1中使用。
      

  2.   

    把vector <CString > VectorString; 设为全局变量CDlg2::OnOK()
    {
    m_ctrListBox.GetText(Item,str); 
    VectorString.push_back(str); 
    .....
    }
      

  3.   

    if(IDOK == dlg2.DoModal()) 

    for(int Item = 0;Item  < dlg.m_ctrListBox.GetCount();Item++) 

    dlg2.m_ctrListBox.GetText(Item,str); 
    VectorString.push_back(str); 

    其中执行到IDOK==dlg2.DoModal()时,第二个对话框已经销毁了,m_ctrListBox控件也就随之没有了,下面代码肯定会出错了,可以将dlg2.DoModal改成弹出一个非模态对话框,如:
    CDlg2 *pDlg2=new CDlg2;
    pDlg2->Create(...);
    pDlg2->ShowWindow(...):
      

  4.   

    非常感谢三楼,我想知道的就是能否通过dlg2中的控件直接获得数据,而不是通过其他方法!!