Сообщите родителю модальных форм, что ему нужно что-то предпринять - PullRequest
3 голосов
/ 15 ноября 2011

У меня есть родительская форма, открывающая модальную форму, которая в основном позволяет пользователю изменять настройки базы данных приложения.

Когда пользователь нажимает кнопку «Сохранить» на модальной (дочерней) форме, он сохраняет объект «Настройки» с новыми настройками, но мне нужно, чтобы «Основная форма» проверила правильность настроек базы данных.

В настоящее время я делаю это с помощью функции, которая пытается просто подключиться к базе данных и в случае успеха возвращает true, в противном случае - false. Эту функцию я выполняю в конструкторе приложений, поэтому она работает нормально, когда приложение закрывается и перезапускается.

Я попробовал следующее в модальной форме после сохранения настроек, но получил исключение NullReference для объекта myManager.

Это функция, которая получает новые настройки и сохраняет их, а затем пытается вызвать открытую функцию родительских форм CheckDatabaseIsSetup () для проверки соединения с БД.

/// <summary>
    /// Save the settings and then hide the Settings window
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_Save_Click(object sender, EventArgs e)
    {            
        // TRUE: User indicates that we are to connect using a trusted connection
        // FALSE: User wants to use Integrated security to connect.
        if (rb_UseTrustedConnection.Checked)
        {

            AppSettings.DatabaseName = tb_Trusted_DbName.Text;
            AppSettings.Server = tb_Trusted_Server.Text;
            AppSettings.UseIntergratedSecurity = false;
        }
        else
        {
            AppSettings.DatabaseName = tb_Secure_DbName.Text;
            AppSettings.Server = tb_Secure_Server.Text;
            AppSettings.Username = tb_Secure_Username.Text;
            AppSettings.Password = tb_Secure_Password.Text;
            AppSettings.UseIntergratedSecurity = true;
        }

        try
        {             
            AppSettings.SaveSettings();
            BushBreaksLodgeManagerMain myManager = (BushBreaksLodgeManagerMain)this.ParentForm;
            myManager.CheckDatabaseIsSetup();
        }
        catch (Exception ex)
        {
            log.LogAppendWithException(ex);
        }

        this.Hide();
    }

Ответы [ 4 ]

1 голос
/ 15 ноября 2011

Вместо этого следует использовать свойство Owner в модальной форме, а не свойство ParentForm следующим образом:

BushBreaksLodgeManagerMain myManager = (BushBreaksLodgeManagerMain)this.Owner;

Свойство Owner определяет фактические отношения между формой, которой владеет (модал), и родителем (владельцем).) форма.

1 голос
/ 15 ноября 2011
BushBreaksLodgeManagerMain myManager = (BushBreaksLodgeManagerMain)this.ParentForm;

Вы можете проверить вышеприведенную строку, имеет ли ParentForm тип / можно привести к BushBreaksLodgeManagerMain.Я предполагаю, что дело не было успешным, поэтому возвращаем null

1 голос
/ 15 ноября 2011

Обычно я делаю это, используя взаимодействие объектов, например, предоставляемое моей библиотекой Emesary ;Конструкция состоит в том, чтобы использовать уведомления таким образом, чтобы запрос отправлялся и обрабатывался всем, кто знает, что ему необходимо обработать эти уведомления, поэтому, например, легко добавить дополнительные обработчики событий, которые отключены.

Вв этом случае код для проверки настроек базы данных будет выглядеть следующим образом:

if (ReceiptStatus.OK == 
    GlobalNotifier.NotifyAll(new CheckDatabaseIsSetupNotification(tb_Secure_DbName.Text,
                             tb_Secure_Server.Text,
                             tb_Secure_Username.Text,
                             tb_Secure_Password.Text,
                             true))
{
     // do something.
}

Чтобы выполнить эту работу, вам нужно реализовать IReceiver в BushBreaksLodgeManagerMain и в вызове конструктора

    GlobalTransmitter.Register(this);

, а затем реализоватьинтерфейс получает:

public ReceiptStatus Receive(INotification _message)
{
    if (_message is CheckDatabaseIsSetupNotification)
    {
         var message = _message as CheckDatabaseIsSetupNotification;
         if (connect_to(message.DatabaseName, message.Server, Message.Username, message.Password, message.UseIntergratedSecurity))
            return ReceiptStatus.OK;
         else
            return ReceiptStatus.Fail;
    }
    return ReceiptStatus.NotProcessed;
}

Вы можете сделать это с помощью событий Windows - но этот способ более понятен и позволяет взаимодействовать с объектами, которые не обязательно имеют окна.

1 голос
/ 15 ноября 2011

Лучше определить событие в дочерней форме и обработать это событие в основной форме, а когда вы вызываете это событие в дочерней форме, основная форма может выполнять свою работу

...