Проблемы с сохранением данных диалога в OnOK - PullRequest
3 голосов
/ 09 октября 2019

Кто-нибудь нашел хороший способ сохранить данные диалога в базе данных в CMyDialog::OnOK?

void CMyDialog::OnOK()
{

    // If I save my data here, I don't know if DoDataExchange()
    // found validation errors.

    CDialog::OnOK();

    // If I save my data here, EndDialog() has already been called

}

Ищите идеи о том, как лучше всего структурировать это. Я знаю, что норма заключается в том, чтобы вызывающая сторона сохраняла данные по мере необходимости, но я не хочу, чтобы диалоговое окно закрывалось, если я сталкиваюсь с ошибкой сохранения данных в базе данных.

Похоже, что хорошим решением было быесли бы CDialog::UpdateData() было виртуальным, но это не так.

Ответы [ 3 ]

5 голосов
/ 09 октября 2019

Почему бы просто не использовать UpdateData?

Возвращаемое значение:

Ненулевое значение, если операция прошла успешно;в противном случае 0. Если bSaveAndValidate равно TRUE, возвращаемое значение, отличное от нуля , означает, что данные успешно проверены .

Итак:

void CMyDialog::OnOK()
{
    if(!UpdateData(TRUE))
    {
        // There was some error with the validation procedure so don't end the dialog.
        return; // Suppress closing dialog
    }

    // OK to save data
    if(!SaveDataToDatabase())
    {
        // Some error
        return;
    }

    // Data validated Ok and was saved to DB OK, so close
    EndDialog(IDOK);
}

Если я не скучаю, понимаю ваш вопрос.

1 голос
/ 09 октября 2019

Итак, кажется, что MFC не предназначен для такой работы.

Но самое простое решение, которое я нашел, было изменить DoDataExchange() следующим образом:

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);

    // DDX and DDV calls go here

    if (pDX->m_bSaveAndValidate)
    {
        if (!SaveData())
            pDX->Fail();
    }
}

КодПриведенное выше основывается на SaveData(), отображающем сообщение об ошибке и возвращающем ложь в случае обнаружения каких-либо ошибок.

В результате выполняется регулярная проверка перед тем, как я пытаюсь сохранить свои данные. И, если код, сохраняющий данные, дает сбой, я все равно могу предотвратить закрытие диалогового окна с помощью той же техники, что и методы проверки MFC. (А именно, позвонив по номеру pDX->Fail()).

0 голосов
/ 09 октября 2019

В своем комментарии вы говорите это:

// If I save my data here, EndDialog() has already been called

Все это означает, что HWND с именем m_hWnd был закрыт и все дочерние элементы управления с ним. Окно мертво, но не ваш экземпляр вашего CVehicleDlg. Переменные-члены, связанные с обменом данными, будут иметь значения из элементов управления, переданных им. Вы должны хорошо пойти на сохранение.

Другой подход заключается в том, чтобы поймать OnDestroy в вашем классе вместо OnOK. Таким образом, вы получаете обработку по умолчанию OnOk для проверки данных. Окно не будет уничтожено, если проверка данных не удалась. Вам придется в специальном случае OnCancel установить флажок "не сохранять", когда ваш диалог уничтожен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...