【问题标题】:C# open a Form and close itC# 打开一个窗体并关闭它
【发布时间】:2017-01-06 07:19:28
【问题描述】:

我想显示一个名为 TTT 的表单,所以我尝试了这个:

public static TTT ttt_local = new TTT();

private void button1_Click(object sender, EventArgs e)
{
    ttt_local.Show();
}

然后我想从内部关闭表单,以便ttt_local 在按下ttt_local 中的按钮时自行关闭。那行得通,但如果我想重新打开ttt_local,我会得到一个ObjectDisposedException。有人可以帮帮我吗?

【问题讨论】:

  • ttt_local.Dispose();
  • 显示关闭表单的方式。我猜你需要的是 hide 表单而不是 close 它。
  • 永远不要写这样的代码,Form 对象是一次性的。一旦关闭,就不能再使用了。并尝试再次使用它会产生 ODE。在需要时创建对象。如果要强制执行单实例行为,请订阅 FormClosed 事件以将 ttt_local 变量设置回 null。

标签: c# winforms


【解决方案1】:

您不需要让表单自己关闭,但是您可以设置它的可见性或简单地隐藏 它(同样适用于显示一个表格):

消费者代码:

var ttt = new TTT();
ttt.Show();

TTT-class:

public class TTT : Form
{    
    private void button2_Click(object sender, EventArgs e)
    {
        this.Hide();
    }
}

现在在您的消费者代码中再次调用ttt.Show(),而不是表单类本身。

您也可以使用Form.Visibility 设置表单的可见性。

【讨论】:

    【解决方案2】:

    你有两个选择。

    1. 使用实例变量而不是类变量,让事情像现在这样工作。
    2. 不要丢弃表单,只需使用Show/Hide 选项即可。

    .

    选项 1:

    public TTT ttt_local = new TTT();
    
    private void button1_Click(object sender, EventArgs e)
    {
        if(ttt_local == null) ttt_local = new TTT(); 
        ttt_local.Show();
    }
    

    选项 2:

    不要关闭表单,只需使用hide/show 甚至设置Visible 属性即可。

    【讨论】:

    • 显然ttt_local 永远不会是null,因为您在表单的构建时设置它。因此,检查毫无意义。
    • 我的意思是当表单关闭时,可以将其设置为null,这样可以更好地保护并在它不可用时创建实例。
    【解决方案3】:

    使用全局变量的原因是什么?您应该只将变量定义放在事件函数中:

    private void button1_Click(object sender, EventArgs e)
    {
        TTT ttt_local = new TTT();
        ttt_local.Show();
    }
    

    每当触发事件时,变量都会创建,然后在关闭表单时进行处理。

    【讨论】:

      【解决方案4】:

      你可以显示它然后隐藏它:

      ttt_local.Show();
      ttt_local.Hide();
      

      或关闭:

      ttt_local.Close();
      

      问候。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多