Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как обратиться к объекту другой формы


Автор: shurokan 8.6.2009, 19:46
Прочитав тему "Как обратиться к объекту другой формы" я так и не понял как обратится в моем, ваще тривиальном примере. Если кому несложно, то помогите.

Есть форма Form1. На ней две кнопки. По нажатию каждой из них, логический флаг сбрасывается. 
Код
private void button1_Click(object sender, EventArgs e)
        {
            bool flag=true;
            Form2 form2 = new Form2();
            form2.Show();    
        }


и...
Код
private void button1_Click(object sender, EventArgs e)
        {
            bool flag=false;
            Form2 form2 = new Form2();
            form2.Show();    
        }


Как мне после этого вывести:
Код
private void Form2_Load(object sender, EventArgs e)
        {
            textBox1.Text="Нажата кнопка: " + flag.ToString() + "!";
        }


?

Модератор: Название темы должно отражать ее суть!

Автор: Экскалупатор 8.6.2009, 20:43
можно через конструктор формы2 сделать, так будет проще всего

Автор: shurokan 8.6.2009, 21:04
приведу полный листинг, что б такие как я не убивали время зря, а может и не зря, но убивали smile

Фома 1:
Код
namespace FLAG
{
    public partial class Form1 : Form
    {
        bool flag;

        public bool Flag
        {
            get { return flag; }
            set { flag = value; }
        }

        public Form1()
        {
            InitializeComponent();           
        }       
      
        private void button1_Click(object sender, EventArgs e)
        {
            flag = true;
            Form2 form2 = new Form2();
            form2.ShowDialog(this);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            flag = false;
            Form2 form2 = new Form2();
            form2.ShowDialog(this);
        }       
    }
}


Форма:
Код
FLAG
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public void Form2_Load(object sender, EventArgs e)
        {
            bool flag2 = (Owner as Form1).Flag;
            textBox1.Text ="Нажата кнопка: " + flag2.ToString()+ "!";
        }
    }
}

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


...но такой способ не канает с MDI окнами :(

Автор: SKrivosein 9.6.2009, 01:23
Может ты спешил, но твой код не работает
1. Form2_Load событие поэтому
Код

public Form2()
        {
            InitializeComponent();

            Load += new EventHandler(Form2_Load); \\ждем его
        }

2.  Логическую переменнуе переводиш в string    
Код

  bool flag2 = (Owner as Form1).Flag;
   textBox1.Text ="Нажата кнопка: " + flag2.ToString()+ "!"; \\?

Ну да ладно, это мелочи.

Автор: SKrivosein 9.6.2009, 01:52
А вот решение наоборот, интересней
user posted image
В первой форме открываем кнопкой вторую форму, там чего то пишем в текст-бокс.
Закрываем вторую форму и возвращаем значение в первую форму, выписываем его в текст-бокс первой формы.
----------------------------
Я бы то делал так:
Код

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            CallBack.callbackEventHandler = new CallBack.callbackEvent(this.getCallBackText);
        }
        private void getCallBackText(string textReturnedFromDialog)
        {
           textBox1.Text = textReturnedFromDialog;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.ShowDialog();
        }
    }
......

public static class CallBack
    {
        public delegate void callbackEvent(string textFromTextBox);
        public static callbackEvent callbackEventHandler;
    }
.......

public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string text2 = textBox2.Text;
            CallBack.callbackEventHandler(text2);
            this.Close();
        }
    }



Автор: KelTron 9.6.2009, 04:47
Код

namespace FLAG
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();           
        }       
      
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(true);
            form2.ShowDialog();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(false);
            form2.ShowDialog();
        }       
    }
}


Код

FLAG
{
    public partial class Form2 : Form
    {
        private bool flag;
        public Form2(bool flag)
        {
            InitializeComponent();
            this.flag = flag;
        }

        public void Form2_Load(object sender, EventArgs e)
        {
            textBox1.Text ="Нажата кнопка: " + this.flag.ToString()+ "!";
        }
    }
}

Автор: shurokan 9.6.2009, 13:04
Цитата(SKrivosein @ 8.6.2009,  23:23)
Может ты спешил, но твой код не работает
1. Form2_Load событие поэтому
Код

public Form2()
        {
            InitializeComponent();

            Load += new EventHandler(Form2_Load); \\ждем его
        }

2.  Логическую переменнуе переводиш в string    
Код

  bool flag2 = (Owner as Form1).Flag;
   textBox1.Text ="Нажата кнопка: " + flag2.ToString()+ "!"; \\?

Ну да ладно, это мелочи.

странно, но у меня работает мой код. smile 

Спасибо, KelTron самый простой и удобный способ передачи переменных который я встречал!

Автор: SKrivosein 9.6.2009, 14:16
shurokan переписую твой код с второго поста в проект VS 2008 
И пускаю в дебагру , вот этот код
Код

public void Form2_Load(object sender, EventArgs e)
        {
            bool flag2 = (Owner as Form1).Flag;
            textBox1.Text = "Нажата кнопка: " + flag2.ToString() + "!";
        }

вобще непроисходит.... Если добавлю "Load += new EventHandler(Form2_Load);"
то в техт-бокс выпишет "Нажата кнопка: True" ну или False.
Так же  smile 

PS:
Цитата

Спасибо, KelTron самый простой и удобный способ передачи переменных который я встречал!

 Экскалупатор об этом писал.

Автор: shurokan 9.6.2009, 16:09
SKrivosein
я так думаю вы просто скопировали листинг, но обработчик load не добавили свойства.
Только-что проверял, создал все с нуля, - работает (VS 2005).

Пробывал создать ваш интересный вариант, у меня не вылетает на 
Код
CallBack.callbackEventHandler(text2);


В чем могу собственно грабли?

Автор: SKrivosein 9.6.2009, 17:49
Признаю свою тупость, я незнаю чего это решил добавить Load руками ? smile 
Мой код у меня работает.

Автор: shurokan 9.6.2009, 19:45
Цитата(SKrivosein @ 9.6.2009,  15:49)
Признаю свою тупость, я незнаю чего это решил добавить Load руками ? smile 
Мой код у меня работает.

полный листинг можна посмотреть?

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