【问题标题】:.Net reference forms application variable.Net 参考表单应用程序变量
【发布时间】:2009-08-24 22:06:37
【问题描述】:

我的应用程序主窗体中有一个公共变量“testStr”。我有一个 tabControl,它添加了加载有用户控件的选项卡。如何从这些用户控件中引用“testStr”?我会想象它是 Application.* 或 parentForm.* ...但我正在尝试的一切都不起作用,不太确定该怎么做,而且我对 .net 有点陌生...在 flex builder 我会做类似于 parentApplication.testStr.

任何帮助将不胜感激...我确信它非常基本且易于操作。

【问题讨论】:

    标签: .net reference scope


    【解决方案1】:

    如何将诸如 testStr 之类的信息(以及其他任何相关内容)存储在它自己的类中并共享对需要使用它的所有其他类的引用?

    因此,您的 MainForm 将创建这个新类的实例,并在创建每个 UserControl 时传递对它们的引用。这样,UserControls 不需要知道任何关于 MainForm 的信息,他们只知道他们使用的数据。如果您更改应用程序的布局,它也会使事情变得更容易。总是假设父级上一级或顶级父级是您想要的表单,这不是很友好。

    【讨论】:

      【解决方案2】:

      您可以在某个静态变量中保存对表单实例的引用。例如你可以编辑Program.cs:

      class Program {
           public static MyForm MainForm { get; private set; }
           static void Main() {
               // ...
               Application.Run(MainForm = new MyForm());
               // ...
           }
      }
      

      然后,您可以使用Program.MainForm.testStr 引用testStr

      【讨论】:

        【解决方案3】:

        如果选项卡控件直接位于顶级表单内,则

        ((this.Parent) as MyForm).testStr
        

        否则您可能需要继续使用 .Parent 直到到达堆栈顶部,然后再转换为表单类型。

        或者

        ((this.FindForm()) as MyForm).testStr
        

        我以前不知道那个...

        【讨论】:

          【解决方案4】:

          您可以向上迭代以获取值:

          class MyControl : UserControl
          {
             public string GetMyStr()
             {
                for (Control c = this.Parent; c != null; c = c.Parent)
                {
                   if (c is MyForm)
                   {
                      return c.testStr; // I recommend using a property instead
                   }
                }
                return null;
             }
          }
          

          或者,如果值在所有实例中都相同,则将其声明为 const、静态只读字段或普通静态字段:

            class MyForm
             {
                public static const string TESTSTR = "...";
             }
          
             class MyControl : UserControl
             {
                public void DoSomething()
                {
                   string s = MyForm.TESTSTR;
                }
             }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多