Reputation:
I am having trouble in enabling or disabling certain text boxes on selection of a particular combobox.
I have tried using OnCbnSelChangeLvLayers()
& OnCbnDropdownLvLayers()
.
The problem with the first event handler is I have to click on the same value twice and the selection in the combobox frezees. The second event handler solves the problem of freezing but I have to click on the dropdown of combobox in order for the event to occur. I also tried a few other event handlers for combobox but was not successful. m_d_layers
is the string variable for the combobox selection (1,2,3,4)
DDX:
void CThermalToolDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_CBString(pDX, IDC_LV_LAYERS, m_d_lvlayers);
}
Message Map:
BEGIN_MESSAGE_MAP(CThermalToolDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_DROPDOWN(IDC_LV_LAYERS, &CThermalToolDlg::OnCbnDropdownLvLayers)
ON_CBN_DROPDOWN(IDC_HV_LAYERS, &CThermalToolDlg::OnCbnDropdownHvLayers)
ON_CBN_DROPDOWN(IDC_LVDUCTTYPE1, &CThermalToolDlg::OnCbnDropdownLvducttype1)
ON_CBN_DROPDOWN(IDC_LVDUCTTYPE2, &CThermalToolDlg::OnCbnDropdownLvducttype2)
ON_CBN_DROPDOWN(IDC_LVDUCTTYPE3, &CThermalToolDlg::OnCbnDropdownLvducttype3)
ON_CBN_DROPDOWN(IDC_HVDUCTTYPE1, &CThermalToolDlg::OnCbnDropdownHvducttype1)
ON_CBN_DROPDOWN(IDC_HVDUCTTYPE2, &CThermalToolDlg::OnCbnDropdownHvducttype2)
ON_CBN_DROPDOWN(IDC_HVDUCTTYPE3, &CThermalToolDlg::OnCbnDropdownHvducttype3)
ON_BN_CLICKED(IDCANCEL, &CThermalToolDlg::OnBnClickedCancel)
ON_BN_CLICKED(ID_CALCULATE, &CThermalToolDlg::OnCalculate)
//ON_CBN_EDITUPDATE(IDC_LV_LAYERS,&CThermalToolDlg::OnCbnEditupdateLvLayers)
//ON_CBN_SELENDOK(IDC_LV_LAYERS, &CThermalToolDlg::OnCbnSelendokLvLayers)
END_MESSAGE_MAP()
Event Handler:
void CThermalToolDlg::OnCbnDropdownLvLayers()
{
// TODO: Add your control notification handler code here
UpdateData();
if (m_d_lvlayers == "1")
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(0);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(0);
//and so on
}
else if (m_d_lvlayers == "2")
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
//and so on
}
else if (m_d_lvlayers == "3")
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
//and so on
}
else
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
//and so on
}
}
I want to obtain the desired enabling/disabling in a single click without freezing of the combobox. Is there any other way or faster method for the same?
Upvotes: 0
Views: 1529
Reputation:
Thanks to @BarmakShemirani I used his code of retrieving the correct string instead of UpdateData()
in ON_CBN_SELENDOK
event handler and now it works like a charm
DDX:
void CThermalToolDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_CBString(pDX, IDC_LV_LAYERS, m_d_lvlayers);
}
Message Map:
BEGIN_MESSAGE_MAP(CThermalToolDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_SELENDOK(IDC_LV_LAYERS, &CThermalToolDlg::OnCbnSelendokLvLayers)
ON_BN_CLICKED(IDCANCEL, &CThermalToolDlg::OnBnClickedCancel)
ON_BN_CLICKED(ID_CALCULATE, &CThermalToolDlg::OnCalculate)
END_MESSAGE_MAP()
Event Handler:
void CThermalToolDlg::OnCbnSelendokLvLayers()
{
// TODO: Add your control notification handler code here
CComboBox *cb = (CComboBox*)GetDlgItem(IDC_LV_LAYERS);
if (cb)
{
int sel = cb->GetCurSel();
if (sel >= 0)
cb->GetLBText(sel, m_d_lvlayers);
}
TRACE(_T("[%s]\n"), m_d_lvlayers.GetString());
/*UpdateData();*/
if (m_d_lvlayers == "1")
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(0);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(0);
GetDlgItem(IDC_LV2_PC)->EnableWindow(0);
GetDlgItem(IDC_LV2_RESIN)->EnableWindow(0);
GetDlgItem(IDC_LV2_RESO)->EnableWindow(0);
GetDlgItem(IDC_LV2_INST)->EnableWindow(0);
GetDlgItem(IDC_LV3_CU)->EnableWindow(0);
GetDlgItem(IDC_LV3_ICI)->EnableWindow(0);
GetDlgItem(IDC_LV3_PC)->EnableWindow(0);
GetDlgItem(IDC_LV3_RESIN)->EnableWindow(0);
GetDlgItem(IDC_LV3_RESO)->EnableWindow(0);
GetDlgItem(IDC_LV3_INST)->EnableWindow(0);
GetDlgItem(IDC_LV4_CU)->EnableWindow(0);
GetDlgItem(IDC_LV4_ICI)->EnableWindow(0);
GetDlgItem(IDC_LV4_PC)->EnableWindow(0);
GetDlgItem(IDC_LV4_RESIN)->EnableWindow(0);
GetDlgItem(IDC_LV4_RESO)->EnableWindow(0);
GetDlgItem(IDC_LV4_INST)->EnableWindow(0);
GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(0);
GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(0);
GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(0);
GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(0);
GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(0);
GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(0);
}
else if (m_d_lvlayers == "2")
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
GetDlgItem(IDC_LV2_PC)->EnableWindow(1);
GetDlgItem(IDC_LV2_RESIN)->EnableWindow(1);
GetDlgItem(IDC_LV2_RESO)->EnableWindow(1);
GetDlgItem(IDC_LV2_INST)->EnableWindow(1);
GetDlgItem(IDC_LV3_CU)->EnableWindow(0);
GetDlgItem(IDC_LV3_ICI)->EnableWindow(0);
GetDlgItem(IDC_LV3_PC)->EnableWindow(0);
GetDlgItem(IDC_LV3_RESIN)->EnableWindow(0);
GetDlgItem(IDC_LV3_RESO)->EnableWindow(0);
GetDlgItem(IDC_LV3_INST)->EnableWindow(0);
GetDlgItem(IDC_LV4_CU)->EnableWindow(0);
GetDlgItem(IDC_LV4_ICI)->EnableWindow(0);
GetDlgItem(IDC_LV4_PC)->EnableWindow(0);
GetDlgItem(IDC_LV4_RESIN)->EnableWindow(0);
GetDlgItem(IDC_LV4_RESO)->EnableWindow(0);
GetDlgItem(IDC_LV4_INST)->EnableWindow(0);
GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(1);
GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(0);
GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(0);
GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(1);
GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(0);
GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(0);
}
else if (m_d_lvlayers == "3")
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
GetDlgItem(IDC_LV2_PC)->EnableWindow(1);
GetDlgItem(IDC_LV2_RESIN)->EnableWindow(1);
GetDlgItem(IDC_LV2_RESO)->EnableWindow(1);
GetDlgItem(IDC_LV2_INST)->EnableWindow(1);
GetDlgItem(IDC_LV3_CU)->EnableWindow(1);
GetDlgItem(IDC_LV3_ICI)->EnableWindow(1);
GetDlgItem(IDC_LV3_PC)->EnableWindow(1);
GetDlgItem(IDC_LV3_RESIN)->EnableWindow(1);
GetDlgItem(IDC_LV3_RESO)->EnableWindow(1);
GetDlgItem(IDC_LV3_INST)->EnableWindow(1);
GetDlgItem(IDC_LV4_CU)->EnableWindow(0);
GetDlgItem(IDC_LV4_ICI)->EnableWindow(0);
GetDlgItem(IDC_LV4_PC)->EnableWindow(0);
GetDlgItem(IDC_LV4_RESIN)->EnableWindow(0);
GetDlgItem(IDC_LV4_RESO)->EnableWindow(0);
GetDlgItem(IDC_LV4_INST)->EnableWindow(0);
GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(1);
GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(1);
GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(0);
GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(1);
GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(1);
GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(0);
}
else
{
GetDlgItem(IDC_LV2_CU)->EnableWindow(1);
GetDlgItem(IDC_LV2_ICI)->EnableWindow(1);
GetDlgItem(IDC_LV2_PC)->EnableWindow(1);
GetDlgItem(IDC_LV2_RESIN)->EnableWindow(1);
GetDlgItem(IDC_LV2_RESO)->EnableWindow(1);
GetDlgItem(IDC_LV2_INST)->EnableWindow(1);
GetDlgItem(IDC_LV3_CU)->EnableWindow(1);
GetDlgItem(IDC_LV3_ICI)->EnableWindow(1);
GetDlgItem(IDC_LV3_PC)->EnableWindow(1);
GetDlgItem(IDC_LV3_RESIN)->EnableWindow(1);
GetDlgItem(IDC_LV3_RESO)->EnableWindow(1);
GetDlgItem(IDC_LV3_INST)->EnableWindow(1);
GetDlgItem(IDC_LV4_CU)->EnableWindow(1);
GetDlgItem(IDC_LV4_ICI)->EnableWindow(1);
GetDlgItem(IDC_LV4_PC)->EnableWindow(1);
GetDlgItem(IDC_LV4_RESIN)->EnableWindow(1);
GetDlgItem(IDC_LV4_RESO)->EnableWindow(1);
GetDlgItem(IDC_LV4_INST)->EnableWindow(1);
GetDlgItem(IDC_LVDUCTTYPE1)->EnableWindow(1);
GetDlgItem(IDC_LVDUCTTYPE2)->EnableWindow(1);
GetDlgItem(IDC_LVDUCTTYPE3)->EnableWindow(1);
GetDlgItem(IDC_LV_D_NO_12)->EnableWindow(1);
GetDlgItem(IDC_LV_D_NO_23)->EnableWindow(1);
GetDlgItem(IDC_LV_D_NO_34)->EnableWindow(1);
}
}
Thanks everyone!
Upvotes: 0
Reputation: 31669
This seems to be a bug for drop-list combobox and simple combobox (not drop-down). DDX_CBString
or DDX_CBStringExact
do not retrieve the right value in response to ON_CBN_DROPDOWN
.
You can use your own code to retrieve the correct string:
void CThermalToolDlg::OnCbnDropdownLvLayers()
{
//UpdateData();
CComboBox *cb = (CComboBox*)GetDlgItem(IDC_LV_LAYERS);
if(cb)
{
int sel = cb->GetCurSel();
if(sel >= 0)
cb->GetLBText(sel, m_d_lvlayers);
}
TRACE(L"%s\n", m_d_lvlayers.GetString());
}
For debugging purposes, comment out other messages except ON_CBN_DROPDOWN(IDC_LV_LAYERS...)
. Make sure you have the correct string before proceeding any further.
Do not call UpdateData(FALSE)
as you have done in your previous question. This can cause problems specially if the correct string is not being retrieved.
Upvotes: 0