На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Передача данных между формами, И изменение свойств одной из другой
    Передача данных из создающей формы тривиальна - надо просто сохранять ссылку на ребёнка, то есть
    ExpandedWrap disabled
      Form f=new Form();//вот этот f и надо где-нибудь сохранить пока его надо использовать


    Естественно свойства/контролы/функции ребёнка к которым нужно обращаться надо делать public или internal

    В обратную сторону всё немного сложнее, но опять же ничего сверхестественного

    Вариант номер раз: используем Form.MdiParent:
    +Ничего дополнительно писать не надо
    -Только для MDI приложений
    -Нельзя использовать родителя в конструкторе ребёнка
    -Exception если MdiParent не того типа что подразумевается

    ExpandedWrap disabled
      public class ParentForm:Form{
      //.......
      public Label label;
      //.......
      public void SomeFunction(){
      ChildForm cf=new ChildForm();
      cf.MdiParent=this;
      cf.Show();
      }
      //.......
      }
      //.......
      public class ChildForm:Form{
      //.......
      private void AnotherFunction(){
      ((ParentForm)MdiParent).label.Text="Matrix has you!";
      }
      //.......
      }


    Вариант номер два: делаем конструктор дочерней формы с параметром:
    +Универсальность
    +Невозможность использования неправильным образом
    -Дополнительный член в классе
    -Нельзя использовать конструктор без параметров

    ExpandedWrap disabled
      public class ParentForm:Form{
      //.......
      public Label label;
      //.......
      public void SomeFunction(){
      ChildForm cf=new ChildForm(this);
      cf.Show();
      }
      //.......
      }
      //.......
      public class ChildForm:Form{
      //.......
      //Здесь храним ссылку на родителя
      private ParentForm parent;
      public ChildForm(ParentForm p){
      parent=p;
      }
      //.......
      private void AnotherFunction(){
      parent.label.Text="Matrix has you!";
      }
      //.......
      }


    Вариант номер три: делаем открытый член в дочерней форме:
    +Универсальность
    -Дополнительный член в классе
    -Не особо "красивое" решение, хотя кого это волнует :)
    -Нельзя использовать родителя в конструкторе

    ExpandedWrap disabled
      public class ParentForm:Form{
      //.......
      public Label label;
      //.......
      public void SomeFunction(){
      ChildForm cf=new ChildForm();
      cf.parent=this;
      cf.Show();
      }
      //.......
      }
      //.......
      public class ChildForm:Form{
      //.......
      //Здесь храним ссылку на родителя
      public ParentForm parent;
      //.......
      private void AnotherFunction(){
      parent.label.Text="Matrix has you!";
      }
      //.......
      }


    Вариант номер четыре: используем паттерн "singleton"
    +Универсальность
    +Невозможность использования неправильным образом
    +Использование паттерна проектирования :)
    -Дополнительный член в классе
    -Нельзя создавать несколько родителей

    ExpandedWrap disabled
      public class ParentForm:Form{
      //.......
      //Единственный экземпляр формы. Естественно его надо инициализзировать
      public static ParentForm Instance;
      //Варианты инициализации:
      //1 - при создании
      public static void Main(){
      Application.Run(ParentForm.Instance=new ParentForm());
      }
      //2 - в конструкторе
      public ParentForm(){
      ParentForm.Instance=this;
      //.......
      }
      //3 - в статическом конструкторе
      static ParentForm(){
      Instance=new ParentForm();
      //В этос варианте больше нигде нельзя делать new ParentForm
      //Например в Main надо написать:
      // Application.Run(ParentForm.Instance);
      }
       
      //.......
      public Label label;
      //.......
      public void SomeFunction(){
      ChildForm cf=new ChildForm();
      cf.Show();
      }
      //.......
      }
      //.......
      public class ChildForm:Form{
      //.......
      private void AnotherFunction(){
      ParentForm.Instance.label.Text="Matrix has you!";
      }
      //.......
      }



    Естественно во всех случаях не забываем о модификаторах доступа, иначе компилятор напомнит
    The three principal virtues of a programmer are Laziness, Impatience, and Hubris.
      Цитата andrey @
      Вариант номер два: делаем конструктор дочерней формы с параметром:
      +Универсальность
      +Невозможность использования неправильным образом
      -Дополнительный член в классе
      -Нельзя использовать конструктор без параметров

      "-Нельзя использовать конструктор без параметров" - МОЖНО! Конструктор можно перегрузить и создавать экземпляр как с параметрами, так и без них.
        а не проще отдавать формам property (OtherForm as System.Windows.Forms) а потом приводить
        как (OtherForm as System.Windows.Forms).RunSomeMethod ?
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,0962 ]   [ 17 queries used ]   [ Generated: 26.09.17, 00:26 GMT ]