-3

我正在尝试Form1在 VB 和 C# 中禁用。

来自 Created 子窗体、按钮单击或 w/e 的示例

  • VB.NET

    Me.Focus()
    Me.Enabled = True
    Form1.Enabled = False
    
  • C#

      //This is my attempt at a functional translation
      //if (_form1 == null)
      //        _form1 = new Form1();
      //    _form1.Enabled = False;
    
     //This is a literal translation
     // This Code will not disable form1
     this.Focus();
     this.Enabled = true;
     Form1.Enabled = false;
    

C# 代码不会Form1像 VB.NET 代码那样从 form2 禁用。

从这些 C# 参考中,我收集了上面注释的代码将起作用(我知道如何在 VB.net 中使用它):Ref1Ref2Ref3

我想知道的是

  • 为什么它如此不同,为什么我不能像在 VB 中那样访问 Form1(来自 Form2)?
  • 还需要哪些其他步骤才能完全访问 Form1?
4

1 回答 1

3

您的 VB 代码正在利用默认表单实例的功能。

(在 VB.NET 中)在幕后,每个 Form 类都被赋予一个与表单本身相同类型的静态变量,当创建一个新表单时,它会将自己设置为该静态变量的值。该变量也是该类型的默认静态属性(VB 具有 C# 没有的另一个功能),这就是您可以使用类型名称直接访问该属性的原因。你可以看到这个相关的问题,了解为什么这个特性仍然存在于 VB 中,尽管事实上它不再严格意义上的意义。

有很多方法可以在 C# 中复制这种行为,自己创建静态属性并手动设置/清除它,但我强烈建议您不要这样做。这个一般概念是相当糟糕的实践,这就是为什么在 C# 中有意省略了这个特性。

即使您使用我的某些表单碰巧只存在一次,从概念上讲也不仅仅是表单的一个实例。

更优选的做法是在您的第二个表单中创建一个第一个表单订阅的事件。(或使用现有事件,如果合适的话)。在这种情况下,您希望Enabled在子表单将其启用为 true 时将父表单设置为 false,您可以通过使用现有事件来做到这一点。

当您在父表单中创建子表单时,只需使用EnableChanged事件根据子表单的操作更改父表单的属性:

Form2 child = new Form2();
child.EnabledChanged += (s, args) => Enabled = !child.Enabled;

然后子表单永远不需要知道任何关于它的 parent。从设计的角度来看,这太棒了。您可以减少耦合并提高模块化。子表单的开发者不需要知道任何关于父表单或它需要做什么的事情。子表单只需要知道任何人可能想要如何使用它并提供所需的功能。

于 2013-09-19T19:41:01.797 回答