组合框选择加载上一个选择

Posted

技术标签:

【中文标题】组合框选择加载上一个选择【英文标题】:Combobox selection loading previous selection 【发布时间】:2019-12-02 07:31:06 【问题描述】:

我有一个包含“1,2,3,4,5”的组合框。当我在组合框中进行选择时,会加载先前的选择。例如,如果组合框中的值为“1”并且我选择“2”,则“1”将加载到我的变量nApplication 中,“2”将显示在我的组合框中。如果我想加载“2”,我需要再更改一次选择。示例从“2”更改为“3”。如何让它加载我选择的号码?我的代码如下所示。

void CAppDlg::DoDataExchange(CDataExchange* pDX)

DDX_Text(pDX, IDC_Application, nApplication);
.
.

void CAppDlg::OnCbnSelchangeapplication()

    UpdateData(TRUE);
    int j = nApplication-1;

    for(int i=0; i<MAX_LABEL; i++)
        bool bShow = i < arrLabel[j];
        ((CButton *)GetDlgItem(IDC_Label1+i))->ShowWindow(bShow);
    

任何帮助将不胜感激。谢谢。

【问题讨论】:

可能CBN_SELCHANGE 消息(映射到OnCbnSelchangeapplication() 处理程序)在组合框的内容更新之前被处理。当用户输入完成时,UpdateData(TRUE) 通常在 OnOK() 处理程序中调用。一种解决方法是更改​​OnCbnSelchangeapplication() 中的代码以发布自定义消息,并将您当前拥有的代码移动到此消息的处理程序。这样UpdateData(TRUE) 将在处理CBN_SELCHANGE 消息“之后”在技术上被调用。 感谢您的回答。但是“发布自定义消息”是什么意思? 例如,PostMessage(WM_APP+100);(参数默认为零)。您还需要在消息映射中添加一个映射宏:ON_MESSAGE(WM_APP+100, OnComboBoxChanged ),当然还要添加 OnComboBoxChanged () 处理程序并将当前位于 OnCbnSelchangeapplication() 中的代码移到那里。 你的问题不清楚。请注意,1 在索引 0 处,2 在索引 1 处,依此类推,但您可能已经知道了。 你为什么要nApplication-1nApplication 是活动索引。当用户更改值时调用选择更改处理程序。 【参考方案1】:

正如我的 cmets 中所解释的,我怀疑组合框的内容在处理 CBN_SELCHANGE 消息后会更新,这就是导致您出现问题的原因。因此,一种解决方法可以是发布自定义(应用程序定义的)消息,以便稍后处理。

函数的类型必须是afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM)(查看文档)。

所以,在你的类声明中,添加:

public:
afx_msg LRESULT OnComboSelChanged(WPARAM wParam, LPARAM lParam);

在您的消息映射中:

ON_MESSAGE(WM_APP+100, OnComboSelChanged)

最后是实现:

void CAppDlg::OnCbnSelchangeapplication()

    // Place a message in the message queue
    PostMessage(WM_APP+100);


LRESULT CAppDlg::OnComboSelChanged(WPARAM wParam, LPARAM lParam)

    UpdateData(TRUE);
    int j = nApplication-1;

    // I have simplified your code a little
    for(int i=0; i<MAX_LABEL; i++)
        GetDlgItem(IDC_Label1+i)->ShowWindow(i < arrLabel[j]);

    return 0L;


然而,所有这一切,即调用UpdateData(TRUE);,在那里获取字符串,将其转换为int并根据其值采取行动,可能只是一种矫枉过正,特别是如果组合框只包含一个连续的数字范围( 1..5 在你的情况下)。 UpdateData(TRUE); 将所有控件中的值传输到变量,这可能只是不需要。它似乎是一种控制其他控件外观的机制,它并不是真正的“数据输入”(我猜组合框是一个不可编辑的下拉列表)。因此,您根本不能使用DDX/DDV,而是自己检查所选项目。这是一个从零开始的索引。这是代码:
void CAppDlg::OnCbnSelchangeapplication()

    // Get selected item
    int j = ((CComboBox *)GetDlgItem(DC_Application))->GetCurSel();
    if (j == CB_ERR) return;

    for(int i=0; i<MAX_LABEL; i++)
        GetDlgItem(IDC_Label1+i)->ShowWindow(i < arrLabel[j]);

请注意,上面的代码片段没有经过测试,这只是我会做的。

【讨论】:

以上是关于组合框选择加载上一个选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Access 中打开表单,自动选择组合框中的值并显示详细信息?

AngularJS 选择的组合框不加载 $http.get 变量

尝试根据另一个组合框的选择填充两个组合框

根据第二个组合框的选择隐藏组合框项目,反之亦然

为啥这个组合框看起来像这样?

根据组合框选择切换表单上其他字段的可见性 - MS Access