组合框选择加载上一个选择
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-1
? nApplication
是活动索引。当用户更改值时调用选择更改处理程序。
【参考方案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 中打开表单,自动选择组合框中的值并显示详细信息?