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


Автор: PaZ1T1V 29.2.2008, 11:28
Здравствуйте, это опять я. У меня такая зада4а стоит есть два класса форм: Form1 и Form2 соответственно (классы независимы)
public partial class Form1 : Form
public partial class Form2 : Form
на форм1 есть кнопка, по нажатию на которую вылазит форм2(реалезовано)
на форм2 есть textBox, в который  загоняется слово(реализовано) и ето слово добавляется на форм1 (ну еесесна после нажатия кнопки на форм2) в Листбокс(как ето сделать) помогите плз smile 
ЗЫ заранее спасибо)  

Код

 public partial class Form1 : Form
................
private void button5_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show();
        }
..........

и
Код

public partial class Form2 : Form
    {
        Form1 form1;

        public Form2()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
                
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string temp;
            if(textBox1.Text == null)
                MessageBox.Show("Введите текст для добавления в строку ");
            if(textBox1.Text != null)
                temp = this.textBox1.Text.ToString();
            if (radioButton1.Checked == true)
            {
                //this.form1.ListBox1.Items.Add(temp);
            }
                
        }
    }

Автор: Sherlock 29.2.2008, 11:58
А после какого события в form2 эта строка попадает в листбокс form1? После того как какую-нибудь кнопку нажал типа "я всё ввёл"? Или после того как закончил вводить в текстбокс?

Автор: Sherlock 29.2.2008, 12:16
Всё я понял. Короче так:
1) Либо делаешь текстбокс во второй форме public, либо заводишь открытое свойство в form2, в которое по нажатию кнопки заносится значение текстбокса.
2) Пишешь такую строчку в form2.Designer.cs для кнопки button1
this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
3) В обработчике нажатия на кнопку в form1 после frm2.Show() пишешь
if (frm2.DialogResult == DialogResult.OK)
{
    .....
    Listbox1.Items.Add(frm2.textbox1.Text) // если public textbox
    Listbox1.Items.Add(frm2.<Имя открытого свойства>) // если завёл свойство
}

Автор: vponomarov 29.2.2008, 12:47
ну если судить по уже написаному коду, то нужно сделать так:
1. или объявить form1.ListBox1 как public
2. или добавить в form1 public метод
Код

public void AddWord(string w)
{
     ListBox1.Items.Add(w);
}

и обработчик клика на кнопку будет иметь вид
Код

 private void button1_Click(object sender, EventArgs e)
        {
            string temp;
            if(textBox1.Text == null)
                MessageBox.Show("Введите текст для добавления в строку ");
            if(textBox1.Text != null)
                temp = this.textBox1.Text.ToString();
            if (radioButton1.Checked == true)
            {
                this.form1.AddWord(temp);
            }
                
        }


хотя лично я обычно делаю как описал Sherlock.

Автор: tol05 29.2.2008, 12:55
С моей точки зрения нужно реализовывать взаимодействие форм через события. Это наиболее универсальный способ. 

Форма1 заинтересована в каком-то событии, происходящем с Формой2. Форма2 объявляет это событие (с именем "НужноеТебеСловоНаконецтоВведеноВМойТексБокс" например), а Форма1 подписывается на это событие своим методом-обработчиком.
Дополнительная информация, необходимая Форме1 от Формы2 (при наступлении этого события) передается как аргументы EventHandler-a

Т.о. сохраняется полная инкапсуляция данных и минимизируются связи между объектами.

Вот наглядный пример
Код

public partial class Form1 : Form
    {
        public event EventHandler MyKeyDown;
        
        public Form1()
        {
            InitializeComponent();
            Form2 form2 = new Form2();
            MyKeyDown += form2.Receive;
            form2.Show();
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if(MyKeyDown != null)
            {
                MyKeyDown(this, e);
            }
        }
    }

Код

public partial class Form2 : Form
    {
        public void Receive(object sender, EventArgs e)
        {
            KeyEventArgs ke = e as KeyEventArgs;
            Text += ke.KeyCode.ToString();
        }
    }

Хотя здесь можно и не делать своего события, а просто textBox1.KeyDown += form2.Receive;
но это в примере, а вообще... при наступлении нестандартных событий нужно и взаимодействовать через события

Автор: PaZ1T1V 29.2.2008, 13:48
Не работает ( 

Автор: PaZ1T1V 29.2.2008, 15:32
Цитата(vponomarov @ 29.2.2008,  12:47)
ну если судить по уже написаному коду, то нужно сделать так:
1. или объявить form1.ListBox1 как public
2. или добавить в form1 public метод
Код

public void AddWord(string w)
{
     ListBox1.Items.Add(w);
}

и обработчик клика на кнопку будет иметь вид
Код

 private void button1_Click(object sender, EventArgs e)
        {
            string temp;
            if(textBox1.Text == null)
                MessageBox.Show("Введите текст для добавления в строку ");
            if(textBox1.Text != null)
                temp = this.textBox1.Text.ToString();
            if (radioButton1.Checked == true)
            {
                this.form1.AddWord(temp);
            }
                
        }


хотя лично я обычно делаю как описал Sherlock.

а не факт 4то вот ето работать будет(немного разобрался) 
 создается во второй форме глобальный объект типа форм1 но ето создается не ссылка на существующую форму а новая форма типа форм1 выходит ето все отпадает 


ЗЫ вопрос не закрыт 
     помогите ламеру плз как сделать ) 

Автор: Cold_Almaty 3.3.2008, 11:16
Цитата

1. или объявить form1.ListBox1 как public


Это нарушение инкапсуляции. Не надо так делать.

Я решил аналогичную задачу, сделав FORM2 диалоговым окном. И добавил на ней свойства, которые и добавляют содержимое текстбокса из формы2 в форму1. 
Посмотри http://forum.vingrad.ru/forum/topic-198022.html. Последний пример вполне рабочий.

Автор: vponomarov 3.3.2008, 11:29
Цитата

Это нарушение инкапсуляции. Не надо так делать

согласен, но приемлемое решение уже было предложено Sherlock и оно почему-то не помогло автору.
вот я и предложил альтернативы.

Цитата

а не факт 4то вот ето работать будет(немного разобрался) 
 создается во второй форме глобальный объект типа форм1 но ето создается не ссылка на существующую форму а новая форма типа форм1 выходит ето все отпадает 


все правильно, просто вы в своем коде в первом посте так написали 
Цитата

this.form1.ListBox1.Items.Add(temp);

вот я и не стал разбираться как там у вас все организовано smile 

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