如何只UpdateData一个对话框的某一个或几个(不是全部)控件的值?

sniper81 2002-09-07 08:24:13
我在做一个基于对话框的应用程序的时候,需要在一个对话框中只对一个Edit控件进行定时刷新,而其他的控件只有在必要的时候才刷新。可是用UpdateData(false)好像对整个对话框的控件都进行了刷新,结果是需要刷新的控件有了内容,而不需要刷新的控件则内容变成了“空”。不知道有没有什么函数或者办法可以只对一个对话框中的部分控件进行刷新而不是全部刷新??
请高手指点一二。不胜感激!!
:-)
...全文
269 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
laserman 2002-09-10
  • 打赏
  • 举报
回复
UpdateData(TRUE)
//do something
UpdateData(FALSE)
sniper81 2002-09-10
  • 打赏
  • 举报
回复
哇,虽然很难懂,可是谢谢楼上的全力帮助.
我的问题已经通过SetWindowText解决了,可是我相信如果有更复杂的类似的问题会用到楼上给我的解决方法的.
谢谢大家的帮助,
我看看管理里怎么给大家分数.
蒋晟 2002-09-09
  • 打赏
  • 举报
回复

就是有条件的DDX啦,DDX只是一个数据交换的方式而已
void CDlgSalesBatchDetail::DoDataExchange(CDataExchange* pDX)
{
CBCGDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgSalesBatchDetail)
DDX_Control(pDX, IDC_LIST_SPEC, m_listSpecCount);
DDX_Check(pDX, IDC_CHECK_PRODUCT_ISNEW, m_bProductIsNew);
DDX_DateTimeCtrl(pDX, IDC_DTP_EDIT_TIME, m_tEditTime);
DDX_Text(pDX, IDC_EDIT_DEPRACIATION, m_cyDepreciation);
DDX_Text(pDX, IDC_EDIT_NOTE, m_strNote);
DDX_Text(pDX, IDC_EDIT_PRICE, m_cyPrice);
DDX_Text(pDX, IDC_EDIT_SALES_BATCH_DETAIL_ID, m_strBatchDetailID);
DDX_Text(pDX, IDC_EDIT_SALES_BATCH_ID, m_strBatchID);
DDX_Text(pDX, IDC_EDIT_SUM, m_cySum);
DDX_Text(pDX, IDC_EDIT_SUM_COUNT, m_lSumCount);
//}}AFX_DATA_MAP
if(m_bUpdateAdoCombos){
DDX_Control(pDX, IDC_LIST, m_wndListPreview);
// SalesHelper::DDX_AdoDataCombo(pDX, IDC_COMBO_SALES_Batch,m_cboBatchID,m_varRetaliID);
SalesHelper::DDX_AdoDataCombo(pDX, IDC_CBO_PRODUCT ,m_cboProduct ,m_varProduct);
SalesHelper::DDX_AdoDataCombo(pDX, IDC_CBO_COLOR ,m_cboColor ,m_varColor);
SalesHelper::DDX_AdoDataCombo(pDX, IDC_CBO_SPEC ,m_cboSpec ,m_varSpec);
}
if(pDX->m_bSaveAndValidate){
CString strTemp;
int iColumnCount=SalesHelper::CGlobal::g_listGetColumnCount(m_listSpecCount);
int iItem=0;
if(iColumnCount>0){
m_arSpecCount.SetSize(iColumnCount);
for(int i=0;i<iColumnCount;i++){
if(m_arSpecCount[i]!=0){
strTemp.Format("%d"),m_arSpecCount[i];
}
else
strTemp=SalesHelper::CGlobal::g_strEmpty;
m_listSpecCount.SetItemText(iItem,i,strTemp);
}
}
}
else{
int iColumnCount=SalesHelper::CGlobal::g_listGetColumnCount(m_listSpecCount);
LPTSTR lpszTemp;
for(int i=0;i<m_arSpecCount.GetSize()&&i<iColumnCount;i++){
m_arSpecCount[i]=_tcstol(m_listSpecCount.GetItemText(0,i), &lpszTemp, 10);
}
}
}
由于我自己写的DDX函数SalesHelper::DDX_AdoDataCombo可能比较慢(要查数据库),所以有时候不参与DDX,比如一个函数可能是这样
m_bUpdateAdoCombos=FALSE;
if(!UpdateData()){//更新数据
m_bUpdateAdoCombos=TRUE;
return;
}
//一个成员变量的值=另外两个成员变量的值之和
UpdateData(FALSE);
m_bUpdateAdoCombos=TRUE;//更新数据
整个过程和SalesHelper::DDX_AdoDataCombo关联的变量没有关系,就不用浪费时间去查数据库了
跑题一下,MSDN技术文章TN026: DDX and DDV Routines很不错的
sniper81 2002-09-08
  • 打赏
  • 举报
回复
嗯,等我回去试试看 :-)


谢谢大家了.
sans 2002-09-08
  • 打赏
  • 举报
回复
通过成员变量或者直接通过控件的ID进行处理比较自由。
flyinginspring 2002-09-08
  • 打赏
  • 举报
回复
GetDlgItem(IDD_***)->SetWindowText("");
IDD_***为你想要改变值的EDIT的ID
jason_sun22 2002-09-08
  • 打赏
  • 举报
回复
干吗不用SetWindowtext() , 这样不就没那么多麻烦了吗?

而且你可以随意对其中的一个或几个进行控制!
sniper81 2002-09-08
  • 打赏
  • 举报
回复
可是我的第二个窗口是在第一个窗口中DoModal出来的。
这是不是表明我的第一个窗口在第二个窗口关闭前是不能被“毁”掉的?
还有,楼上的我对DDX的操作不很熟悉,能不能说清楚一点。
m_bUpdateData是哪里来的变量,作用是什么?这个if具体该怎么写?

谢谢大家的帮助。
蒋晟 2002-09-07
  • 打赏
  • 举报
回复
if(m_bUpdateData)
DDX.....
everandforever 2002-09-07
  • 打赏
  • 举报
回复
第二个窗口向第一个窗口发WM_CLOSE消息
p1stWnd->SendMessage(WM_CLOSE,0,0);
delete p1stWnd;
当然了,你的第一个窗口必须是new出来的。
homor 2002-09-07
  • 打赏
  • 举报
回复
怎么会不需要刷新的控件内容都成空了呢?用控件变量的话,需要刷新时调用UpdateData(False)语句,只要控件变量不为空,控件的内容就不是空。
sniper81 2002-09-07
  • 打赏
  • 举报
回复
此话怎解?
那些控件都已经通过DDX和变量相关联了阿。
如果只是改变了相关联的变量,并不能直接在对话框上反映出来啊。
还有个问题,如何建立两个对话框,在第二个对话框出现后让第一个对话框消失,最好是让它析构掉。
用户 昵称 2002-09-07
  • 打赏
  • 举报
回复
可以用控件变量的形势,这样就不用updatedata了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧