【问题标题】:3 Forms, close 2nd and open 3rd3 个表格,关闭第 2 并打开第 3
【发布时间】:2016-04-22 02:45:54
【问题描述】:

我有 3 个表格

//Example:
public Form 1;
public Form 2;
public Form 3;

当我启动我的程序时,它在 Form1 中。 我从 Form1 打开 Form2

Form2 f2 = new Form2();
this.Hide() //Save in memory
f2.ShowDialog();
this.Show();

所以在 Form2 中。我打开form3

Form2 f3 = new Form2();
this.Close() //Trying Destroy Form2 and open Form3.
f3.ShowDialog();
this.Show(); 

最后,我想从 Form3 打开新的 Form2(重新加载所有数据) 但我没有这样做。如何解决?

【问题讨论】:

  • 如果您希望 Form2 重新加载数据,只需使用 Form3 作为来自 Form2 的对话框,并通过关闭时返回的属性触发更改。除非您真的想要 2 个实例,否则不应打开 Form2 的第二个实例。
  • 我应该如何刷新Form2? @ChrisFannin 可以提供示例代码吗?
  • Mark Hall 在下面提供了一个不错的示例,尽管我会走一条稍微不同的路线。由于已经很晚了,我现在无法编写自己的示例。

标签: c# winforms


【解决方案1】:

在调用f3.ShowDialog() 之后不能调用this.Show(),因为 ShowDialog() 会打开一个模式窗口,该窗口会阻塞所有其他 UI 线程,因此在模式窗口关闭之前,它后面的任何语句都不会执行。

【讨论】:

  • 是的。那么我应该怎么做才能完成我的任务呢?
【解决方案2】:

您没有说明您将什么用于数据源或如何更新您的 2nd Form。我个人会根据第一个表单使用对话框结果值来确定是否重新加载第二个表单。

类似这样的:

Form1

public partial class Form1 : Form
{
    Form2 f2;
    Form3 f3;
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        f2 = new Form2();
        f2.FormClosing += F2_FormClosing;
        this.Hide();
        f2.Show();
    }

    private void F2_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (((Form2)sender).DialogResult == DialogResult.OK)
        {
            f3 = new Form3();
            f3.FormClosing += F3_FormClosing;
            f3.Show();
        }
        else
        {
            this.Visible = true;
        }

    }

    private void F3_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (((Form3)sender).DialogResult == DialogResult.OK)
        {
            f2 = new Form2();
            f2.FormClosing += F2_FormClosing;
            f2.Show();
        }
        else
        {
            this.Visible = true;
        }
    }
}

Form2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult = DialogResult.OK;
        this.Close();
    }
}

Form3

public partial class Form3 : Form
{
    string myData;
    public Form3()
    {
        InitializeComponent();
    }
    public string getData
    {
        get
        {
            return myData;
        }
        set
        {
            myData = value;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult = DialogResult.OK;
        this.Close();
    }
}

【讨论】:

    【解决方案3】:

    应该是这样的,

    在表格 2 中

    Form3 f3 = new Form3();
    f3.show(); //shouldn't use ShowDialog since it will block the thread
    this.close();
    

    在表单 3 中,只需创建一个新的 Form2 实例并显示为您想要的。

    Form2 f2 = new Form2();
    f2.showDialog();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多