【问题标题】:Enabling and disabling forms in C#在 C# 中启用和禁用表单
【发布时间】:2015-07-07 12:53:22
【问题描述】:

我在 C# 中创建了两个表单:form1 是主应用程序,form2 是登录窗口。 form1 有一个禁用自身并显示 form2 的按钮,而 form2 有一个启用主窗体并自行关闭的按钮。问题是当我尝试使用 form2 按钮启用 form1 时(我得到“Application.exe 中发生'System.NullReferenceException' 类型的未处理异常”)

这是form1的代码:

Login  Login = new Login();
Login.Show();
this.Enabled = false;

form2(登录)代码:

(this.Owner as Form1).Enabled = true;  ===> this line gets highlighted
 Close();

【问题讨论】:

  • 因为你在创建Login表单的时候没有设置它的owner属性,所以它为null。它不会因为您以一种形式打开它而自动设置...另外,不要这样做:Login Login = new Login();,将变量命名为与您正在实例化的类型相同的坏习惯,这使得它很难如果以后需要,您可以在不完全限定类型的情况下调用静态方法。
  • 如果您想以模态方式显示表单(自动禁用父级),请改为调用 ShowDialog。您能解释一下为什么要禁用 Form1 吗?

标签: c# .net winforms


【解决方案1】:

form1中的这行代码改成

Login.Show();

Login.Show(this);

或在显示之前明确设置所有者:

Login.Owner = this;
Login.Show();

否则,当您尝试访问其成员时,登录表单将没有所有者,this.Owner 将为空,导致 NullReferenceException

【讨论】:

    【解决方案2】:

    您可以使用ShowDialog,这将使所有其他表单(同一应用程序的)在表单显示期间无法访问:

    using (var login = new Login()) {
        login.ShowDialog(this);
    }
    

    您可以传递DialogResult 值之一作为返回码,以将成功或失败传递给调用方法。

    【讨论】:

    • 很确定这是 OP 试图实现的目标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多