我写了一个对话框,里面放了个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.
{
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.
DCPart3 D3;这里你又定义了一个DCPart3类的实例!虽然都是DCPart3类,但实例是不同的,就好比DCPart3是人,那么虽然你和你同学都是人,但显然你和你的同学是不一样的实例!!!你怎么可以把你要完成的事,不明不白的就让你同学去做呢?不死才怪
你必须想办法在D2中获得你需要操作的D3的指针,然后通过D3的指针来更新D3
在这个对话框上有一个Tab Control控件,然后控件里面加载三个属性页?
如果是这样,你可以在子窗口中通过
(CYourDlg *)AfxGetMainWnd()获得窗口的指针pDlg,然后通过访问你在对话框中实例化过的三个m_D1,m_D2,m_D3;
通过pDlg->m_D3.D3的方法来实现你要的功能