首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CComboBox DDX_CBString行为混淆

CComboBox DDX_CBString行为混淆
EN

Stack Overflow用户
提问于 2016-03-15 16:21:34
回答 2查看 1K关注 0票数 4

我在对话框中使用一个ComboBox控件给用户一些有用的值(Ex: 10;20;100;400;800),但是如果需要的话让用户插入确切的值。

我在很长一段时间后发现:如果我在组合框中键入值40,则Combobox将在UpdataData()总是400之后返回。)( 3941值为Ohterwards,没有问题。

这不是我和用户所期望的行为。

当我输入一个值时,ComboBox应该接受这个值,如果从下拉列表中选择这个值,请接受这个值。

我现在看到这种行为是由DDX_CBString给出的。

我是否必须编写自己的DDX_CBString,还是有其他方法?

代码:

代码语言:javascript
复制
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!
}
EN

回答 2

Stack Overflow用户

发布于 2016-03-18 12:16:24

我通过修改DDX_CBtring来解决这个问题。

代码语言:javascript
复制
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);
        } 
       */
    }
}

如果有其他人,请告诉我。

票数 2
EN

Stack Overflow用户

发布于 2018-03-28 13:17:02

旧问题的新答案:您不必编写自己的DDX处理程序,但它不是一个bug。DDX_CBString有意进行部分字符串比较,而提供了DDX_CBStringExact来进行精确的字符串比较。MSDN文档对这种差异并没有很好的解释,所以我同意这是令人困惑的。

您只需手动将行更改为:

代码语言:javascript
复制
DDX_CBStringExact(pDX, IDC_IFBANDWIDTH, m_sIFBandWidth);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36016759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档