对话框数据交换#
//{{Jiangsheng的垃圾代码(对话框数据交换)
class CDataTypeFieldExChange;
//CTextFieldEdit是一个派生于CEdit,绑定到记录集字段的编辑框
//lpszFieldName是绑定的字段的名称
//vt是绑定的字段的类型
void DDX_TextField(CDataTypeFieldExChange* pDX, int nIDC, CTextFieldEdit& rControl,
LPCTSTR lpszFieldName,VARTYPE vt=VT_BSTR);
//DDX_TextField的封装;自动从数据类型获取字段名称:描述/别名/标识字段;并且有简单的验证
void DDX_InfoField(CDataTypeFieldExChange* pDX, int nIDC, CTextFieldEdit& rControl);
void DDX_AliasField(CDataTypeFieldExChange* pDX, int nIDC, CTextFieldEdit& rControl);
void DDX_IDField(CDataTypeFieldExChange* pDX, int nIDC, CTextFieldEdit& rControl);
void DDX_AliasField(CDataTypeFieldExChange* pDX, int nIDC, CTextFieldEdit& rControl)
{
DDX_TextField(pDX,nIDC,rControl,pDX->m_pDTC->m_pDataType->m_strAliasField);
switch(pDX->m_pDTC->m_adReason)
{
case adRsnAddNew:
case adRsnUpdate:
case adRsnDelete:
if(pDX->m_pDX->m_bSaveAndValidate)
{
CString strText;
rControl.GetWindowText(strText);
if(strText.FindOneOf(T("/\\*?[]\"<>失望的脸"))!=-1){
CString strTemp;
strTemp.Format(_T("%s不能包含以下字符: / \\ * ? [ ] \" < > : |")
,pDX->m_pDTC->m_pDataType->m_strAliasField);
::AfxMessageBox(strTemp);
pDX->m_pDX->Fail();
}
}
}
void DDX_IDField(CDataTypeFieldExChange* pDX, int nIDC, CTextFieldEdit&? rControl)
{
if(pDX->m_pDX->m_bSaveAndValidate)
{
TRACE_LINE(_T("Ignore DDX for %s/%s")
,pDX->m_pDTC->m_pDataType->m_strDataType
,pDX->m_pDTC->m_pDataType->m_strIDField
眨眼笑脸;
}
else
{
DDX_TextField(pDX,nIDC,rControl,pDX->m_pDTC->m_pDataType->m_strIDField);
}
}
void DDX_InfoField(CDataTypeFieldExChange* pDX, int nIDC, CTextFieldEdit& rControl)
{
DDX_TextField(pDX,nIDC,rControl,pDX->m_pDTC->m_pDataType->m_strInfoField);
switch(pDX->m_pDTC->m_adReason)
{
case adRsnAddNew:
case adRsnUpdate:
case adRsnDelete:
if(pDX->m_pDX->m_bSaveAndValidate)
{
CString strText;
rControl.GetWindowText(strText);
if(strText.IsEmpty())
{
CString strTemp;
strTemp.Format(_T("%s不能为空!"),pDX->m_pDTC->m_pDataType->m_strInfoField);
::AfxMessageBox(strTemp);
pDX->m_pDX->Fail();
}
if(strText.FindOneOf(T("/\\*?[]\"<>失望的脸"))!=-1)
{
CString strTemp;
strTemp.Format(_T("%s不能包含以下字符: / \\ * ? [ ] \" < > : |",pDX->m_pDTC->m_pDataType->m_strInfoField));
::AfxMessageBox(strTemp);
pDX->m_pDX->Fail();
}
}
else{
if(!pDX->m_pDTC->m_strAddNew.IsEmpty())
{
rControl.SetWindowText(pDX->m_pDTC->m_strAddNew);
}
}
}
}
void DDX_TextField(CDataTypeFieldExChange* pDX
, int nIDC
, CTextFieldEdit& rControl
,LPCTSTR lpszFieldName
,VARTYPE vt//=VT_BSTR
)
{
FieldsPtr?pFields=pDX->m_pRecordset->Fields;
CString strFieldName(lpszFieldName);
CDataType* pDT=pDX->m_pDTC->m_pDataType;
CString strVal;
if (!pDX->m_pDX->m_bSaveAndValidate)
{
switch(pDX->m_pDTC->m_adReason)
{
case adRsnAddNew:
case adRsnUpdate:
case adRsnDelete:
if(!strFieldName.IsEmpty()){
strVal=g_GetValueString(pFields->Item[lpszFieldName]->Value);
}
else{
ASSERT(FALSE);
}
}
}
DDX_Control(pDX->m_pDX,nIDC,rControl);
DDX_Text(pDX->m_pDX,nIDC,strVal);
if(pDX->m_pDX->m_bSaveAndValidate)
{
switch(pDX->m_pDTC->m_adReason)
{
case adRsnAddNew:
case adRsnUpdate:
case adRsnDelete:
{
_variant_t varVal;
if(g_SetValueString(varVal,strVal,vt))
{
TRACE_LINE(_T("Set Field %s to %s\n"),lpszFieldName,strVal);
if(!strFieldName.IsEmpty()){
pFields->Item[lpszFieldName]->Value=varVal;
}
else{
ASSERT(FALSE);
}
}
}
}
}
else{
//编辑框的前一个控件是其标题,其文字从数据库中的类型定义获得
CWnd* pStatic=rControl.GetNextWindow(GW_HWNDPREV);
CString strCaption=pDT->GetFieldProperty(lpszFieldName,_T("Caption"));
if(pStatic&&!strCaption.IsEmpty())
{
pStatic->SetWindowText(strCaption);
}
rControl.SetClientTipText(pDT->GetFieldProperty(lpszFieldName,_T("Comments")));
}
}
//}}End Jiangsheng的垃圾代码(对话框数据交换)
WinForm
对话框数据交换 (Update)