我在对话框中使用一个ComboBox控件给用户一些有用的值(Ex: 10;20;100;400;800),但是如果需要的话让用户插入确切的值。
我在很长一段时间后发现:如果我在组合框中键入值40,则Combobox将在UpdataData()总是400之后返回。)( 39或41值为Ohterwards,没有问题。
这不是我和用户所期望的行为。
当我输入一个值时,ComboBox应该接受这个值,如果从下拉列表中选择这个值,请接受这个值。
我现在看到这种行为是由DDX_CBString给出的。
我是否必须编写自己的DDX_CBString,还是有其他方法?
代码:
void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_IFBANDWIDTH, m_cIFBandWidth);
DDX_CBString(pDX, IDC_IFBANDWIDTH, m_sIFBandWidth); // Bahavior confusing
}
BOOL CTestDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
m_cIFBandWidth.ResetContent();
m_cIFBandWidth.AddString(_T("10"));
m_cIFBandWidth.AddString(_T("20"));
m_cIFBandWidth.AddString(_T("100"));
m_cIFBandWidth.AddString(_T("400"));
m_cIFBandWidth.AddString(_T("800"));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CTestDialog::OnBnClickedApply()
{
UpdateData(TRUE); // m_sIFBandWidth now 4 ok!
UpdateData(FALSE); // m_sIFBandWidth still 4, but control show 400, so the next OnOk() or Apply() take this value. Wrong!
}发布于 2016-03-18 12:16:24
我通过修改DDX_CBtring来解决这个问题。
void DDX_CBString_Normal(CDataExchange* pDX, int nIDC, CString& value)
{
..
if (pDX->m_bSaveAndValidate)
{
..
}
else
{
// Behaviour as we expect: Type a value and keep it
// Select it form dropwon, or take the value the user type it
AfxSetWindowText(hWndCtrl, value);
return;
/* Disable original MS behavior
// set current selection based on model string
if (::SendMessage(hWndCtrl, CB_SELECTSTRING, (WPARAM)-1,
(LPARAM)(LPCTSTR)value) == CB_ERR)
{
// just set the edit text (will be ignored if DROPDOWNLIST)
AfxSetWindowText(hWndCtrl, value);
}
*/
}
}如果有其他人,请告诉我。
发布于 2018-03-28 13:17:02
旧问题的新答案:您不必编写自己的DDX处理程序,但它不是一个bug。DDX_CBString有意进行部分字符串比较,而提供了DDX_CBStringExact来进行精确的字符串比较。MSDN文档对这种差异并没有很好的解释,所以我同意这是令人困惑的。
您只需手动将行更改为:
DDX_CBStringExact(pDX, IDC_IFBANDWIDTH, m_sIFBandWidth);https://stackoverflow.com/questions/36016759
复制相似问题