2012-08-08 3 views
2

У меня есть одна форма, которая открывает другую форму при нажатии кнопки. Когда открывается новая форма, у меня есть индикатор выполнения через цикл, затем я хочу, чтобы форма закрылась. Здесь отображается событие нажатия кнопки, которое запускает новую форму.Невозможно создать форму «закрыть себя»?

private void calculateButton_Click(object sender, EventArgs e) 
    { 

     if (checkFormComplete()) 
     { 
      ProgressForm proForm = new ProgressForm(); 
      proForm.Show(); 
     } 

    } 

И вот код для новой формы, который завершает индикатор выполнения, который затем должен закрыть сам.

public ProgressForm() 
    { 
     InitializeComponent(); 
     for (int i = 0; i < 101; i++) 
      calculationProgress.Value = i; 

     this.Close(); 
    } 

Однако после запуска этого я получаю:

Не удается получить доступ к объекту, расположенный. Имя объекта: «ProgressForm».

и отладчик указывает на этой линии моей главной формы:

proForm.Show(); 

Я не уверен, я понимаю, почему, или то, что правильный способ сделать это. Как эта строка вызывается после закрытия в моей новой форме?

+0

Это выглядит очень похоже вы звоните Close() из конструктора ProgressForm, поэтому вызов Show() [от calculateButton_Click] после того, как вы назвали Close (который будет вызывать Dispose) не будет работать –

ответ

8

Форма пытается закрыть себя до того, как ее покажут (потому что у вас есть код в конструкторе). Поместите свой штрих-код прогресса и Close() вызовите вместо этого FormLoad или FormShown. Пример:

private void ProgressForm_Shown(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 101; i++) 
    { 
     calculationProgress.Value = i; 
     Application.DoEvents(); // force the form to update itself 
    } 

    this.Close(); 
} 
+0

Если вы используете * Application.DoEvents *, bue * sure *, вы знаете, как это работает http://stackoverflow.com/a/5183623/141172. Они обычно ** не ведут себя так, как вам хотелось бы. –

+0

Действительно - удалено из кода. – Hoff

+0

Хммм ...но затем изменения в * calculateProgress * не будут отображаться, потому что события WM_PAINT не обрабатываются. –

2

Разрешить загрузки завершить, прежде чем пытаться закрыть форму :-)

Вы должны начать свой бар цикл прогресса в случае Form_Load.

Однако обратите внимание, что такой цикл приведет к тому, что ваша форма будет заблокировать, пока индикатор выполнения не завершит рендеринг.

Проделайте цикл прогресса в фоновом потоке. A BackgroundWorker идеально подходит для управления контуром хода.

public proForm() 
{ 
    InitializeComponent(); 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.WorkerSupportsCancellation = true; 
} 

proForm_Load() 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 

    (int i = 0; i < 101; i++) worker.ReportProgress(i); 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
     resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    this.Close(); 
} 
0

Конструктор используется для инициализации объект не разрушая объект в самом застройщик.

Таким образом, конструктор должен содержать код инициализации.

Ваш код пытается уничтожить объект с помощью this.Close(); в конструкторе, следовательно, ошибка.

Введите код в поле Load.

Изменение calculationProgress.Value черезProgressChanged событиечрезвычайной BackgroundWorker в

Смежные вопросы