如何重新加载/重新打开相同的表单C#

时间:2017-07-05 22:32:48

标签: c# winforms

每当两个单选按钮都未选中时,我想重新加载当前表单(不是主表单)。我做到了这一点,但它没有工作。

StreamWriter sw;
using (sw = File.CreateText(path))
{
    if (OnewayRadio.Checked == true)
    {
        sw.WriteLine("One Way Ticket");
    }
    else if (RoundRadio.Checked == true)
    {
        sw.WriteLine("Round Trip");
    }
    else
    {
        MessageBox.Show("You have not selected your type of trip!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        sw.Close();
        File.Delete(path);
        sw = File.CreateText(path);
    }
    sw.WriteLine("Name: " + name.Text);
    sw.WriteLine("Number: " + number.Text);
}

2 个答案:

答案 0 :(得分:0)

通常的做法是使用ShowDialog

打开表单

当表单中的代码完成执行时,它将设置公开DialogResult

然后,来电者可以阅读DialogResult并采取任何必要的行动。

在您的情况下,您可以为此特定实例设置DialogResultRetry。然后,开启者可以运行循环并在ShowDialog() == DialogResult.Retry

时继续显示表单
Form2 testDialog = new Form2();

// Show testDialog as a modal dialog and determine if DialogResult = OK.
while (testDialog.ShowDialog() == DialogResult. Retry)
{
    testDialog.Dispose();
    testDialog = null;
    testDialog = new Form2();
}

答案 1 :(得分:0)

这里的答案假设重新打开的表单是模态的。并非总是如此。在将表单设为非模式而不是模式时遇到了这个问题。

使用.Hide()代替.Close()。

像这样将Hide放置在FormClosing()事件中,

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
      Hide();
      e.Cancel = true;
    }

以这种方式“关闭”表单后,对Show()的下一次调用将没有问题。

对于我来说,关闭表单后必须执行一些操作。如果您通常以Modal状态打开,则关闭窗体后,ShowDialog()将返回,就像这样

    {
      // ..

      form1.ShowDialog();
      OperationsAfterClose(form1);

      // .. 
   }

非模式调用形式。Show()将立即返回。因此,像我的OperationsAfterClose()这样的任何结尾都将立即被调用。

我使用委托来移动动作,如下所示,

   public delegate void OnFormHide(FrmMapFerryAnalysisSpec2 f);

   public partial class Form1 : Form
   {
      public OnFormHide OnForm1Hide = null;
      // ..
   

      private void Form1_FormClosing(object sender, FormClosingEventArgs e)
      {
        if (OnForm1Hide!=null) OnForm1Hide (this);   // call the delegate
        Hide();
        e.Cancel = true;
      }

      // ..
  }

在调用表单中,我现在可以将OperationsAfterClose()作为委托传递,

{
    // ..
    form1.Show();
    form1.OnForm1Hide = OperationsAfterClose;     // set the delegate

    // .. 
}

注意:

  • 为了安全地使用它,form1句柄应该存在并且不能多次创建!

  • 在大多数应用程序中,该表单也只能打开一次。为此,最简单的方法是在调用表单中引入一个IsOpenForm1布尔值。