我写了一个对话框,里面放了个tab control,tab有三个标签,分别对应的类是DCPart1,DCPart2,DCPart3,我在DCPart2中放了些edit控件,一个添加按钮,已经连上数据库,然后在DCPart3中我放了个list control控件,用来显示数据库中的数据,现在的问题是,我在DCPart2中一添加完数据,然后选标签3,也就是DCPart3,它不会显示实时更新,我就把它改成了在DCPart2中点添加按钮时,调用DCPart3中的一个用来显示数据的方法让它重新显示,一些代码如下DCPart3中用来显示数据的方法void DCPart3::OnAddList()
{
UpdateData(TRUE);
    ADO m_Ado;
m_Ado.OnInitADOConn();
m_Ado.m_pConnection->CursorLocation=adUseClient;
CString sql = "select * from infomation order by  ID desc";
m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql); while(!m_Ado.m_pRecordset->adoEOF)
{
 m_List.InsertItem(0,"");
 m_List.SetItemText(0,0,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("编号"));
 m_List.SetItemText(0,1,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("姓名"));
 m_List.SetItemText(0,2,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("年龄"));
 m_List.SetItemText(0,3,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("性别"));
     m_List.SetItemText(0,4,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("专业"));
 m_List.SetItemText(0,5,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("班级"));
 m_List.SetItemText(0,6,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("爱好"));
 m_Ado.m_pRecordset->MoveNext();
} m_Ado.CloseRecordset();
m_Ado.CloseConn();}
DCPart2中的按钮添加点击方法如下void DCPart2::OnUserAdd() 
{  UpdateData(FALSE);
  CString u_number,u_name,u_age,u_sex,u_majoy,u_class,u_hobby;
  ADO m_Ado;
  m_Ado.OnInitADOConn();
  m_Ado.m_pConnection->CursorLocation=adUseClient;  DCPart3 D3;
  //传值到定义字符串
  m_Unumber.GetWindowText(u_number);
  m_Uname.GetWindowText(u_name);
  m_Uage.GetWindowText(u_age);
  m_Usex.GetWindowText(u_sex);
  m_Umajoy.GetWindowText(u_majoy);
  m_Uclass.GetWindowText(u_class);
  m_Uhobby.GetWindowText(u_hobby);  if(u_number.IsEmpty() || u_name.IsEmpty() || u_age.IsEmpty() || u_sex.IsEmpty() || u_majoy.IsEmpty() || u_class.IsEmpty() || u_hobby.IsEmpty())
  {
   MessageBox("输入值不允许为空");
   return;
  }  CString sql = "select * from infomation";
  m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql);
  CString sql1;
  sql1.Format( "select * from infomation where 编号 = '%s'",u_number);
  m_Ado.m_pRecordset1 = m_Ado.OpenRecordset(sql1);
 
  if(m_Ado.m_pRecordset1->RecordCount>0)
  {
   MessageBox("编号重复,请重新插入");
  }
  else
  {     try
 {
        m_Ado.m_pRecordset->AddNew();
      m_Ado.m_pRecordset->PutCollect("编号",(_bstr_t)u_number);
     m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)u_name);
     m_Ado.m_pRecordset->PutCollect("年龄",(_bstr_t)u_age);
    m_Ado.m_pRecordset->PutCollect("性别",(_bstr_t)u_sex);
     m_Ado.m_pRecordset->PutCollect("专业",(_bstr_t)u_majoy);
     m_Ado.m_pRecordset->PutCollect("班级",(_bstr_t)u_class);
     m_Ado.m_pRecordset->PutCollect("爱好",(_bstr_t)u_hobby);
        m_Ado.m_pRecordset->Update();
m_Ado.CloseRecordset();
        m_Ado.CloseConn();
    
 }
      catch(...)
  {
 MessageBox("添加失败");
  }
  }
    MessageBox("添加成功");  D3.m_List.DeleteAllItems();  //调用D3对象将DCPart3中的list control控件m_List清空再显示
  D3.OnAddList();  m_Unumber.Clear();
  m_Uname.Clear();
  m_Uage.Clear();
  m_Usex.Clear();
  m_Umajoy.Clear();
  m_Uclass.Clear();
  m_Uhobby.Clear();
}
这个方法我添加了一个DCPart3 D3这个对象,然后在下面  D3.m_List.DeleteAllItems(); D3.OnAddList();这两个调用来重新打开,可是这样写了就出问题了,点添加时弹出错误信息对话框,信息如下
Debug Assertion Failed!
Program:E:\VC++ workspace\Student\Debug\Student.exe
File:afxcmn.ini
Line:148
For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts.

解决方案 »

  1.   

    典型的新手代码,先搞明白类和实例的区别吧。
    DCPart3 D3;这里你又定义了一个DCPart3类的实例!虽然都是DCPart3类,但实例是不同的,就好比DCPart3是人,那么虽然你和你同学都是人,但显然你和你的同学是不一样的实例!!!你怎么可以把你要完成的事,不明不白的就让你同学去做呢?不死才怪
      

  2.   

    呵呵,解释的简单精辟
    你必须想办法在D2中获得你需要操作的D3的指针,然后通过D3的指针来更新D3
      

  3.   

    你是建的基于对话框的程序吗?
    在这个对话框上有一个Tab Control控件,然后控件里面加载三个属性页?
    如果是这样,你可以在子窗口中通过
    (CYourDlg *)AfxGetMainWnd()获得窗口的指针pDlg,然后通过访问你在对话框中实例化过的三个m_D1,m_D2,m_D3;
    通过pDlg->m_D3.D3的方法来实现你要的功能
      

  4.   

    非常感谢各位的帮忙,已经解决了,方法就是King_hhuang的,也非常感谢happyparrot的提醒,我确实疏忽了类、和实例的问题