Передача переменных между формами в C # - PullRequest
0 голосов
/ 04 августа 2011

У меня есть 2 формы - Form1 и Form2.

Form1:

    public partial class Form1 : Form
    {
        public void Drawnewmap(bool suzey) {
            bool dsuzey=suzey;
            if (dsuzey==true) textBox1.Text = "1" ;

        }

        public Form1()
        {
            InitializeComponent();
        }
     }

Form2:

private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    f1.Drawnewmap(m);
    this.Close();
}

но когда я нажимаю, ничего не происходит. TextBox пуст. Почему?

Ответы [ 5 ]

2 голосов
/ 10 декабря 2012

Если вы хотите получить свою первую активную форму через вторую форму, вы должны определить первую форму во второй форме, например:

Form1 frm = (Form1)Application.OpenForms["Form1"];

вместо

Form1 f1 = new Form1();

Поскольку вы создадите новую форму, если будете использовать «Form1 f1 = new Form1 ();», вы не получите активную форму.

2 голосов
/ 04 августа 2011

Вы никогда не показываете форму, возможно, у вас должно быть что-то похожее на:

У меня есть 2 формы - Форма 1 и Форма 2.

private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    f1.Drawnewmap(m);
    f1.Show(); // You're missing this call
    this.Close();
}
1 голос
/ 04 августа 2011

Я предпочитаю решать эту проблему, используя свойства в формах, содержащих состояние

== Форма 1 ==

public partial class Form1 : Form
{
    bool is_dsuzey;

    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        if (is_dsuzey) textBox1.Text = "1";
    }
    public bool IsDsuzey { get { return is_dsuzey; } set { is_dsuzey = value; } }

}

== Форма 2 ==

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.IsDsuzey = checkBox1.Checked;
        f1.Show();
    }
}

Я бы предостерег, чтобы поместить оператор this.Close(); в Form2, если он является основной формой приложения, поскольку он закроет все приложение.Если Application.Run() вызывает какую-то другую форму, то проблем нет.

1 голос
/ 04 августа 2011

Поскольку вы создаете новый экземпляр Form1.И я думаю, что это плохая идея вызывать что-то из родительского окна в дочернем окне.Но вы можете сделать сглаживание следующим образом: при создании Form2 передайте ссылку на текущий объект Form1

Form2 form = new Form2(this);

В конструкторе Form2 сохраните ссылку Form1 в приватной переменной.

private Form1 myform1;

Тогда ваш коднужно выглядеть так:

private void button1_Click(object sender, EventArgs e)
{
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    myform1.Drawnewmap(m);
    this.Close();
}
1 голос
/ 04 августа 2011

Вы не показали form1, который вы создали.

private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    f1.Drawnewmap(m);

    f1.Show();//or ShowDialog()...
    this.Close();
}

Обратите внимание, что если Form2 является основной формой «вы можете проверить это в главном», если вы закроете ее, она закроет все приложение, поэтому в этом случае либо сделайте форму1 главной или позвоните по этому номеру this.Hide(); вместо this.Close();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...