Не можете получить доступ к удаленному объекту? - PullRequest
7 голосов
/ 09 августа 2011

У меня есть форма таймера обратного отсчета - в первой форме пользователь вводит время обратного отсчета - время предупреждения, сообщение о завершении и т. Д. Есть также две радиокнопки (макс. / Мин.), И в зависимости от того, какой из них выбран, они будут открываться. новая форма Max или Min, где время фактически начнет обратный отсчет. Он работает нормально и ведет обратный отсчет, как я и ожидал. Однако, если я выхожу из формы Max или Min и пытаюсь запустить снова с новым временем, я получаю сообщение об ошибке. Код ниже - обратите внимание на закомментированный .ShowDialog (this); это было то, что я попробовал - это позволило мне закрыть и открыть новые формы, но на самом деле это не запустило обратный отсчет. UpdateLabels - это функция обновления ярлыков.

                bool Max = rbMax.Checked;
                if (Max == true)
                {
                    //_Max.ShowDialog(this);
                    _Max.Show();

                }
                else
                    //_Min.ShowDialog(this);
                    _Min.Show();

                UpdateLabels();
            }

Я также попробовал следующее, которое я прочитал онлайн как возможное решение, но оно также не сработало ....

    private void Max_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Hide();
        this.Parent = null;
    }

Может кто-нибудь помочь мне - я могу опубликовать функцию UpdateLabels, если это необходимо. Я довольно новичок в разработке пользовательского интерфейса на C #, поэтому любая помощь будет отличной. Спасибо.

Ответы [ 5 ]

4 голосов
/ 09 августа 2011

Что вы можете сделать, это добавить следующую проверку перед вызовом .Show метод:

if(_Max == null || _Max.IsDisposed)
    _Max = new MaxForm();       

_Max.Show();

и аналогично для _Min формы

4 голосов
/ 09 августа 2011

Проблема в том, что закрытая форма больше не может быть использована (открыта заново). Вот почему код, который вы разместили, пытается перестать закрываться и только скрывает ваше окно. Но для этого свойство Cancel должно быть установлено в true:

private void Max_FormClosing(object sender, FormClosingEventArgs e)    {        
   this.Hide();        
   this.Parent = null;    
   e.Cancel=true;
}

Чтобы показать форму после ее закрытия, покажите ее методом Show ().

Однако это, вероятно, только обходной путь, и вы можете решить проблему с другим дизайном. Может быть, было бы разумно создать новый экземпляр вашей формы, каждый раз, когда вам это нужно, вместо того, чтобы пытаться открывать его каждый раз. Это также имеет то преимущество, что форма запрашивает ресурсы только в том случае, если она действительно необходима.

1 голос
/ 09 августа 2011

Когда форма закрыта, все ее ресурсы освобождаются .Это означает, что вы больше не можете получить доступ к объекту, так как он больше не существует - он был освобожден и удален из памяти.Чтобы предотвратить это, вы можете отменить закрытие формы и скрыть ее (что будет казаться прозрачным для пользователя).

this.Hide();        
e.Cancel=true;

Обновленная версия вашего кода выглядит следующим образом:

private void Max_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
    this.Hide();
    this.Parent = null;
}
0 голосов
/ 23 августа 2018

Создать объект внутри события нажатия кнопки, как это

private void btn_supplier_order_Click(object sender, EventArgs e)
        {
            form_supplier_order so = new form_supplier_order();
            so.Show();
        }
0 голосов
/ 24 октября 2014

Простое решение - создать экземпляр объекта вызываемой формы в событии нажатия кнопки, например,

private void buttonSetting_Click( object sender, EventArgs e )
    {
        ***_setting = new SettingWindow();***  //When I need to show the settings window

        _setting.Show();
    } 
...