Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Связь между формами


Автор: svarogik 8.6.2008, 20:29
у меня есть в приложении две формы, хочу чтобы при нажатии кнопки на одной форме на другой в лист боксе чето появлялось, и заодно запускался один из встроенных методов в форме, подскажите как

Автор: Raid 8.6.2008, 22:08
Из главной в дочернюю можно передавать так:
В классе дочерней формы пишешь метод заполнения листбокса
В главной форме при нажатии на кнопку вызываешь этот метод через объект второй формы и на сторой формочке всё заполняется
Если нужны параметры из главной формы, то методу их передавай

Автор: informatik 8.6.2008, 22:19
Я думаю тут должно быть уточнение - в каком порядке эти формы запускаются и запускают ли друг друга?. 

Как я понял эти формы не запускают друг друга, а каждая отдельно, .т.е они функционируют не зная о друг друге?


Автор: Raid 8.6.2008, 22:25
Значит третий объект, который знает о существовании обеих форм, подписывается на клик кнопки на первой форме и вызывает описанный метод для второй формы.

Автор: svarogik 8.6.2008, 22:27
нет две дочерние формы вызываются при создании главной, а как вызвать метод? у меня так в форме есть процедурка, которая в массив (поле класса форма) добавляет елемент, я хочу чтоб элемент добавлялся при нажатии кнопки на другой форме

Добавлено через 6 минут и 17 секунд
я еще не совсем понимаю как главная форма создается, ведь я пока описываю только абстрактный класс, к абстрактному обьекту обратится нельзя, а как там она будет называться при инициализации не совсем понимаю

Автор: Raid 8.6.2008, 22:49
Смотри, главная форма это form1 Можно типо паттерна Наблюдатель организовать

Код

public interface IObserver //интерфейс
    {
        void HandleClick();
    }
    public partial class Form1 : Form, IObserver
    {
        Form2 frm2;
        Form3 frm3;
        public Form1()
        {
            InitializeComponent();
            frm2 = new Form2((IObserver)this); // второй форме передаешь ссылку на главную и когда по второй кликнут, то можно вызвать метод HandleClick() первой формы
            frm3 = new Form3();
        }
        public void HandleClick()  // раелизация интерфейса
        {
            frm3.FillListBox();
        }
    }


вторая форма это форма, по которой кликают
Код

 public partial class Form2 : Form
    {
        IObserver observer;
        public Form2(IObserver o)
        {
            InitializeComponent();
            observer = o;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            observer.HandleClick();
        }
    }


и в третьей 
Код

    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        public void FillListBox()
        { 
        // заполняешь массивами как тебе нужно
        }
    }

Автор: svarogik 8.6.2008, 22:50
еще уточнение мне надо чтоб по нажатию в дочерней писалось в другой дочерней, а процедурка в главной

Добавлено через 4 минуты и 30 секунд
и кнопок несколько, в зависимости от того какая нажата нужно вызвать разные процедуры, и написать разный текст в листбокс

Добавлено через 4 минуты и 52 секунды
мне для каждой кнопки наблюдателя чтоли делать?

Автор: svarogik 8.6.2008, 23:11
Код

public interface IObserver //интерфейс
    {
        void HandleClick();
    }
 
    public partial class Form1 : Form
    {
        public rect rectW;
        public Form3 inform;
        public Form2 coform;

        public List<rect> bl = new List<rect>();
        public List<rect> wh;

        public List<string> ff = new List<string>();
      //public List<string> ff;

        public Form1()
        {
            InitializeComponent();
            SolidBrush brush1 = new SolidBrush(Color.Black);
            inform = new Form3();
           /*( ! )*/ coform = new Form2((IObserver)this);
        }

        public void HandleClick()  // раелизация интерфейса
        {
            inform.FillListBox();
        }


там где пометил ошибка выскакивет, не совсем везжаю что за дела
Unable to cast object of type 'WindowsApplication5.Form1' to type 'WindowsApplication5.IObserver'.
в других формах все сделал как надо

Автор: Raid 8.6.2008, 23:18
Извини, я одним глазом футбол смотрю))
Необязательно для каждой кнопки наблюдателя. при клике каждой кнопы вызывай HandleClick , но ему например число передавай, по которому будешь определять какая кнопка нажата. И для каждой кнопки свое число.
интерфейс поменять чуть-чуть
Код

public interface IObserver //интерфейс
    {
        void HandleClick(int buttinID);
    }


Даже наверное проще можно.  Form3 можно объявить как наблюдателя

Код

    public partial class Form3 : Form, IObserver
    {
        public Form3()
        {
            InitializeComponent();
        }
        public void HandleClick(int buttonID)
        { 
Код



        // заполнение
        }
    }

Код

    public partial class Form2 : Form
    {
        IObserver observer;
        public Form2(IObserver o)
        {
            InitializeComponent();
            observer = o;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            observer.HandleClick(1);
        }

А в главной форме сначала объект формы3 инициализируешь и передаешь в конструктор второй
Код

inform= new Form3();
coform= new Form2(frm3);


Обрати внимание в объявлении Form3 ещё и интерфейс IObserver написан. без этого привести объект Form3 к типу IObserver не получится

Автор: svarogik 9.6.2008, 00:25
ничего не понял в последней строчке. интерфейс описан вне класса ,при написании внутри формы мы просто создаем новый метод, который с нашим обсервером никак не связан, нет вообще конечно все запускается, но как чтото сделать на главной не знаю как

Автор: Raid 9.6.2008, 00:45
Цитата

интерфейс описан вне класса ,при написании внутри формы мы просто создаем новый метод, который с нашим обсервером никак не связан

говорю же, надо указать что формочка реализует этот интерфейс Form3: From, IObserver. Это и есть связка.
Цитата

но как чтото сделать на главной не знаю как 

у тебя алгоритм, который определяет что нужно заносить в листбокс в главной форме или в самой дочерней ???
Если что можем в аське продолжить и не шлёпать тут сообщения )) аська в профиле у меня

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)