为什么“this”有效,但“Form.Activeform”抛出NullRefernceException?

Why "this" works but "Form.Activeform" throws NullRefernceException?

提问人:yigitt 提问时间:5/23/2014 最后编辑:Tim Schmelteryigitt 更新时间:5/23/2014 访问量:11294

问:

如果此关键字引用 Program class(Application.Run(new Form1())) 中实例化的类的当前实例

我们可以用这个关键字来访问它的属性

        this .Text = "debuggging";
        this .Opacity = 54;
        this .ShowIcon = true;
        this .Size = new Size(100, 100);

为什么不能使用 Form1.ActiveForm 实现它。*(所有属性)

只是出于好奇,但为什么

当像这样编码时

        Form1.ActiveForm.Text = "debugla";
        Form1.ActiveForm.Opacity = 54;
        Form1.ActiveForm.ShowIcon = true;
        Form1.ActiveForm.Size = new Size(100, 100);

并且 ActiveForm 必须为我们带来当前使用的活动表单

它抛出 nullreference 异常为什么?

c#

评论

1赞 Uwe Keim 5/23/2014
发布您收到的错误消息怎么样?
1赞 Tim Schmelter 5/23/2014
MSDN:Form.ActiveForm:“表示当前活动窗体的窗体,如果没有活动窗体,则为 null
0赞 Jeppe Stig Nielsen 5/23/2014
编写有点令人困惑,因为此属性实际上是在基类上定义的。仅当 (1) 存在一个 which 现在处于活动状态,并且 (2) 现在处于活动状态的形式是 的实例,并且与它的实例相同时,表达式才成立。Form1.ActiveFormstaticFormActiveForm == thisFormForm1this

答:

5赞 Sayse 5/23/2014 #1

ActiveForm 返回活动表单...这意味着,如果您的窗口没有焦点,则它不处于活动状态。因此,以这种方式使用它,您的程序将面临产生错误的巨大风险。

使用可确保您正在访问要更改的表单this

您还应该注意,这是一个静态属性,因此它与您使用它的窗体没有任何链接,如果您在应用程序中打开了任何其他窗口,那么您的更改可能会应用于这些其他对话框ActiveForm

评论

0赞 yigitt 5/23/2014
你说得对,问题是调试,因为我在表单出现之前调试了应用程序,所以控件没有显示或单击它,这意味着没有焦点,这也意味着 isN't 处于活动状态,所以 Form1.Activeform 为 Null,但如果 ı 不调试并让表单打开,显示,这 =(等于)表单。Activeform,因为形式在展示后得到了焦点,所以很高兴学习差异谢谢
7赞 Tim Schmelter 5/23/2014 #2

MSDN:Form.ActiveForm:“表示当前活动窗体的窗体,如果没有活动窗体,则为 null

所以可能是因为你正在调试表单不是活动状态(没有焦点),所以它返回。null

评论

0赞 yigitt 5/23/2014
你说得对,问题是调试,因为我在表单出现之前调试了应用程序,所以控件没有显示或单击它,这意味着没有焦点,这也意味着 isN't 处于活动状态,所以 Form1.Activeform 为 Null,但如果 ı 不调试并让表单打开,显示,这 =(等于)表单。Activeform,因为形式在展示后得到了焦点,所以很高兴学习差异谢谢
0赞 Hassan 5/23/2014 #3

您可以这样做:

 Form currentForm = Form.ActiveForm;

 if(currentForm != null)
 {
     //use currentForm properties
 }

Form.ActiveForm获取此应用程序的当前活动窗体

而这指的是 的当前实例。Form1