Передача переменной между 3 формами - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь передать пару переменных между 3 отдельными формами. Форма 1 - это место, где каждый игрок (2 игрока) выбирает свое имя и тип. Затем он устанавливает переменные игрока 1 во вторую форму, а переменные игрока 2 в третью форму.

 private void button_player2Ready_Click(object sender, EventArgs e)
    {
        p2_name = textBox_P2.Text;


        if (p2_name.Length > 0 && p2_type != null)
        {
            foreach (Control cont in groupBox_p2.Controls)
            {
                cont.Enabled = false;

            }
            player2Ready = true;

            if (player1Ready == true && player2Ready == true)
            {
                Form1 firstForm = new Form1();
                Form2 secondForm = new Form2();
                Form3 thirdForm = new Form3();

                //thirdForm.p2_name = "hello";
                thirdForm.p2_type = p2_type;
                thirdForm.p2_name = p2_name;



                secondForm.p1_name = p1_name;

                secondForm.p1_type = p1_type;



                this.Hide();
                secondForm.Show();



            }
        }
        else
        {
            MessageBox.Show("Error: You have not selected a name or type...");

        }

    }
}

Вторая форма работает нормально, и имя игрока 1 отображается на этикетке, но я считаю, что это вызывает проблемы при переходе на 3-ю форму, поскольку она сбрасывает имя третьей формы из-за этого "Form3 thirdForm = new Form3 () ; "

      public string p1_name { get; set; }


    public string p1_type { get; set; }



    public string word4player2;

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        label1.Text = $"{p1_name} choose your opponents word...";

    }

    private void button_submit_Click(object sender, EventArgs e)
    {
        if (!textbox_p1Word.Text.Contains(" "))
        {
            word4player2 = textbox_p1Word.Text;
            Form1 firstForm = new Form1();
            Form2 currentForm = new Form2();
            Form3 thirdForm = new Form3();

            thirdForm.Show();
            Hide();


        }
        else
        {
            MessageBox.Show("No Spaces allowed...");

        }

    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e) //this is needed bc form1 is only hidden when form 2 opens thus not closing application properly
    {

        Application.Exit();
    }
}

Это моя третья форма, в которой должно отображаться имя игрока 2. Форма открывается без ошибок, но место, где указано имя, пустое.

    public string p2_name { get; set; }


    public string p2_type { get; set; }

    public string word4player2;

    public Form3()
    {
        InitializeComponent();
    }


    private void button_submit_Click(object sender, EventArgs e)
    {
        if (!textbox_p2Word.Text.Contains(" "))
        {
            word4player2 = textbox_p2Word.Text;
        }
        else
        {
            MessageBox.Show("No Spaces allowed...");

        }

    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e) //this is needed bc form1 is only hidden when form 2 opens thus not closing application properly
    {
        Application.Exit();
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        label1.Text = $"{p2_name} choose your opponents word...";
    }

Любая помощь будет отличной!

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы настраиваете

thirdForm.p2_type = p2_type;
thirdForm.p2_name = p2_name;

в основной форме и создайте еще один экземпляр Form3 в Form2 и покажите его. Обратите внимание, что при каждом вызове конструктора объекта создается новый экземпляр этого класса.

Form3 thirdForm = new Form3();

строка в Form1 создает экземпляр типа Form3 и устанавливает свойства типа и имени. Но этот экземпляр не показан. Вы создаете другой экземпляр Form3 в методе button_submit_Click формы Form2 и показывает это без установки значений типа и имени. Если эта форма будет вызываться только в Form2, то вы должны поместить два свойства в класс Form2 для p2_type и p2_name и организовать метод как

private void button_submit_Click(object sender, EventArgs e)
{
    if (!textbox_p1Word.Text.Contains(" "))
    {
        word4player2 = textbox_p1Word.Text;
        Form1 firstForm = new Form1();
        Form2 currentForm = new Form2();
        Form3 thirdForm = new Form3();

        thirdForm.p2_type = p2_type;
        thirdForm.p2_name = p2_name;

        thirdForm.Show();
        Hide();
    }
    else
    {
        MessageBox.Show("No Spaces allowed...");

    }

}

и Форма1

        if (player1Ready == true && player2Ready == true)
        {
            //Form1 firstForm = new Form1();//YOU DON'T NEED IT HERE
            Form2 secondForm = new Form2();
            //Form3 thirdForm = new Form3();//YOU DON'T NEED IT HERE


            secondForm.p2_type = p2_type;
            secondForm.p2_name = p2_name;

            secondForm.p1_name = p1_name;
            secondForm.p1_type = p1_type;

            this.Hide();
            secondForm.Show();
        }
0 голосов
/ 03 января 2019

Если вы не используете Form3 напрямую из Form1, я бы воздержался от создания экземпляра Form3 в Form1.

Для передачи значений в Form3 вы можете сначала передать его в Form2, а затем в Form2 передать его в Form3 при его вызове.

В форме1

        Form2 secondForm = new Form2();
        secondForm.p1_name = p1_name;
        secondForm.p1_type = p1_type;

        secondForm.Show();

В форме 2

        Form3 thirdForm = new Form3();
        thirdForm.p2_name = p2_name;
        thirdForm.p2_type = p2_type;
        thirdForm.Show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...