2013-09-22 3 views
-4

У меня есть две формы по имени mainForm и helperForm. На mainForm у меня есть кнопка, а на helperForm у меня есть richTextBox. Я хочу сделать это; после нажатия кнопки на mainForm я хотел бы отобразить helperForm, а также некоторый текст в richtextbox. С ниже кодом я могу видеть помощник формы, но текст идет после кнопки закончить весь процесс, который идет внутри ButtonClick события ...Открыть форму внутри другой формы?

MainForm

public partial class Form : Form 
{ 
    public HelperForm helperForm; 

    public MainForm() 
    { 
    InitializeComponent(); 
    } 

    public void button_Click(object sender, EventArgs e) 
    { 
    helperForm= new HelperForm(); 
    helperForm.Show();  

    helperForm.richTextBox1.AppendText("Program started"); 

    //doing process1 
    helperForm.richTextBox1.AppendText("Program start to check process1"); 

    //doing process2 
    helperForm.richTextBox1.AppendText("Program start to check process2"); 

    //doing process3 
    helperForm.richTextBox1.AppendText("Program start to check process3"); 

    //doing process2 
    helperForm.richTextBox1.AppendText("All the process are done!"); 

    helperForm.Close(); 
} 
+1

Если вы хотите выполнить много кода из обработчика события Click, вам понадобятся потоки, чтобы избежать этого, чтобы пользовательский интерфейс не реагировал. Вставка вызовов helperForm.Update() - очень несовершенное, но простое обходное решение. –

+0

@HansPassant Я удалил helperForm.Close(), но все же текст появился после завершения всех процессов. – user2611251

+0

Ваш фрагмент кода очень неясен, он скрывает реальную проблему. Этот код мы не видим, что мешает элементам управления рисовать себя. Как отмечено, вызов helperForm.Update() после каждого вызова AppendText() заставляет элементы управления рисовать, чтобы вы могли его видеть. Я настоятельно рекомендую книгу о программировании Winforms, понимая, что это не тривиально и очень важно, чтобы писать правильный код GUI. –

ответ

0

Попробуйте это;

public void button_Click(object sender, EventArgs e) 
    { 
     helperForm= new HelperForm(); 
     Timer countdown=new Timer(); 
     countdown.Interval=1000;//1000 Milliseconds 
     countdown.Tick+=CountDownTickEvent; 

     switch(condition to check which text to append): 
     { 
     case 1: 
     helperForm.richTextBox1.AppendText("Program started"); 
     break; 

     case 2: 
     //doing process1 
     helperForm.richTextBox1.AppendText("Program start to check process1"); 
     break; 

     case 3: 
     //doing process2 
     helperForm.richTextBox1.AppendText("Program start to check process2"); 
     break; 

     case 4: 
     //doing process3 
     helperForm.richTextBox1.AppendText("Program start to check process3"); 
     break; 

     case 5: 
     //doing process2 
     helperForm.richTextBox1.AppendText("All the process are done!"); 
     break; 
     } 

     helperForm.Show(); 

    } 

Вы показываете форму modelessly, это означает, что это один не будет блокировать поток вызывающего абонента, так что нет никаких оснований называть Form.Close() 6 заявления позже, чем Form.Show(), это не имеет смысла, это просто отображает форму для flash, а затем формы disapperars.If вам нужно показать форму для указанной продолжительности лучше использовать Timer.

Редактировать: Чтобы показать форму на указанную продолжительность, используйте нижеприведенную функцию;

int counter=0; 
    public void button_Click(object sender, EventArgs e) 
    { 
     helperForm= new HelperForm(); 
     Timer countdown=new Timer();//New instance of Timer class. 
     countdown.Interval=1000;//1000 Milliseconds,change as needed. 
     countdown.Tick+=CountDownTickEvent;//Event handler for tick event of Timer. 

     //Same as above. 

     helperForm.Show(); 
     countdown.Start();//Start the timer. 
    } 

Затем создать CountDownTickEvent ниже одного;

private void CountDownTickEvent(object sender, EventArgs e) 
    { 
     counter++; 
     if (counter == 5)//5 seconds have been passed since the timer is running.Change as needed. 
     { 
      helperForm.Close();//Displayed for 5 seconds,form should close now. 
      counter=0; 
     } 
    } 

Ну, что дает вам helperForm в течение 5 секунд с текстом, а затем он автоматически закрывается.

0

Правильное решение использовать фоновый поток для достижения типа «прогресс бар» дисплея, который предотвращает блокировки пользовательского интерфейса. Когда вы управляете действиями пользовательского интерфейса из фонового потока, вам нужно вызывать эти действия для предотвращения исключений - обновленный пользовательский интерфейс не допускается непосредственно из фоновых потоков.

Следующий код делает то, что вы хотите, но вам нужно прочитать информацию о потоках, вызовах и делегатах, или это не имеет никакого смысла. Если бы мы могли видеть больше вашего кода, может быть способ использовать Application.DoEvents(), но это более подходит в цикле, который дает хорошее место для повторения команды. Я по-прежнему предпочитаю фоновые темы, если не собираю небольшую служебную программу.

public partial class Form1 : Form 
{ 
    private HelperForm helperForm; 
    private Thread processRunner; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (processRunner == null || processRunner.ThreadState == ThreadState.Stopped) 
     { 
      helperForm = new HelperForm(); 
      helperForm.Show(); 

      processRunner = new Thread(new ThreadStart(runProcesses)); 
      processRunner.Start(); 
     } 
    } 

    private void runProcesses() 
    { 


     this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("Program started"); })); 

     //represents process1 
     Thread.Sleep(2000); 

     this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("Program start to check process1"); })); 

     //represents process2 
     Thread.Sleep(2000); 

     this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("Program start to check process2"); })); 

     //represents process3 
     Thread.Sleep(2000); 

     this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("Program start to check process3"); })); 

     //represents process4 
     Thread.Sleep(2000); 

     this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("All the process are done!"); })); 

     // to let the message display 
     Thread.Sleep(2000); 

     helperForm.Invoke(new Action(() => { helperForm.Close(); })); 
    } 
} 
Смежные вопросы