Переменная приложения .Net Reference Form - PullRequest
0 голосов
/ 25 августа 2009

У меня есть открытая переменная "testStr" в основной форме моих приложений. У меня есть tabControl, который добавляет вкладки, загруженные пользовательскими элементами управления. Как я могу ссылаться на "testStr" из этих пользовательских элементов управления? Я мог бы представить, что это либо Application. *, Либо parentForm. * ... но все, что я пытаюсь, не работает, не совсем уверен, как это сделать, и я немного новичок в .net ... во Flex Builder, я бы сделал что-то вроде parentApplication.testStr.

Буду признателен за любую помощь ... Я уверен, что это довольно простой и простой способ сделать.

Ответы [ 4 ]

1 голос
/ 25 августа 2009

Как насчет хранения информации, такой как testStr (и всего, что с ней связано), в своем собственном классе и предоставления ссылки на любой другой класс, который должен ее использовать?

Таким образом, ваша MainForm создаст экземпляр этого нового класса и передаст ссылку на каждый UserControl по мере их создания. Таким образом, UserControls не нужно ничего знать о MainForm, они просто знают о данных, с которыми они работают. Это также облегчит задачу, если вы когда-нибудь измените макет приложения. Всегда предполагая, что родительский уровень на один уровень выше или родительский уровень является той формой, которую вы хотите, не очень удобен для изменений.

1 голос
/ 25 августа 2009

Вы можете сохранить ссылку на экземпляр формы в некоторой статической переменной. Например, вы можете редактировать Program.cs:

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

Тогда вы можете ссылаться на testStr с помощью Program.MainForm.testStr.

0 голосов
/ 25 августа 2009

Вы можете выполнить итерацию вверх, чтобы получить значение:

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;
      }
   }
0 голосов
/ 25 августа 2009

Если элемент управления вкладками находится непосредственно внутри формы верхнего уровня, тогда

((this.Parent) as MyForm).testStr

В противном случае вам может потребоваться продолжить прием. Parent, пока не достигнете вершины стека, а затем приведете к типу формы.

В качестве альтернативы

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

Я не знал об этом раньше ...

...