MFC DDX_Radio causes debug assertion failure when DoDataExchange is called (dlgdata.cpp Line 286)

1.5k views Asked by At

I have a dialog with radio button with groups of 4 buttons. DDX_Radio(pDX, D_RADIO_GROUPLEAD, intToStore) in DoDataExchange is there for saving and loading. It works perfectly fine.

Selection changed, DoDataExchange called, stores and loads data no problem.

Problem occurs when I hide one of the radio button (hide it via ShowWindow(SW_HIDE). Let's just call it 3rd button for reference. And previously, the selection was this 3rd button.

I have logic that will automatically select the default one (one with Group flagged as true in the editor). I call the button's SetCheck(1).

Visually everything seems to be working.

However, when I click on 2nd button, then try to call DoDataExchange (hence DDX_Radio), it will causes debug assertion failure. (dlgdata.cpp Line 286)

AND

the data is not properly populated back in intToStore.

Why could this be and how can I avoid this issue?

Thank you.

1

There are 1 answers

0
xMRi On

The problem is, that the auto radio button stuff in Windows skips buttons that are disabled. In detail. You click on button 2 while button 3 is selected and disabled. Button 2 gets selected but button 3 is not unchecked.

The next problem occurs when DoDataExchange runs. It doesn't check if a button is enabled or disabled. DDX_Radio just loops over all radio buttons, and it find 2 buttons in the group are enabled. This causes the ASSERT. DDX_Radio don't care if a button is enabled or disabled.

My advice: Use a custom OnClick handle by yourself, and disable all other buttons manually.