C # - Как сделать, чтобы две формы ссылались друг на друга - PullRequest
4 голосов
/ 01 сентября 2011

Я пишу приложение WindowsForms в MS Visual C #, и мне нужны две формы, чтобы иметь возможность ссылаться друг на друга.Во время тестирования я создал две кнопки в форме Form1 - одну кнопку, которая отображает форму Form2, и другую кнопку, которая скрывает ее (код приведен ниже).

Я хочу сделать то же самое для Form2 - создать две кнопки, которыескрыть или показать Form1.Я использовал тот же метод, что и для Form1, но когда я компилирую приложение, оно, похоже, попадает в бесконечный цикл, и я получаю сообщение StackOverflow.

Как изменить код так, чтобы обе формыспособны ссылаться друг на друга?

Код формы 1:

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    Form2 frm2;
    public Form1()
    {
        InitializeComponent();
        frm2 = new Form2();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm2.Visible = true;
    }
}
}

Код формы 2:

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
    Form1 frm1;
    public Form2()
    {
        InitializeComponent();
        frm1 = new Form1();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm1.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm1.Visible = true;
    }
}
}

Ответы [ 6 ]

5 голосов
/ 01 сентября 2011

Код Forms2 должен быть

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
    Form1 frm1;
    public Form2(Form1 parent)
    {
        InitializeComponent();
        frm1 = parent;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm1.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm1.Visible = true;
    }
}
}

Несмотря на то, что оба разговаривают друг с другом, один должен быть создан первым и передан второму.

Form1 нужно будет настроить на

public Form1()
{
    InitializeComponent();
    frm2 = new Form2(this);
}

Другой способ сделать это - создать оба и передать их после построения

namespace WindowsFormsApplication1
{
public class SomewhereElse
{
    public void SomeFunction()
    {
         Form1 form1= new Form1();
         Form2 form2= new Form2();

         form1.frm2 = form2;
         form2.frm1 = form1;
    }
}

public partial class Form2 : Form
{
    public Form1 frm1 {get; set;}
    public Form2(Form1 parent)
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm1.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm1.Visible = true;
    }
}

public partial class Form1 : Form
{
    public Form2 frm2 {get; set;}
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm2.Visible = true;
    }
}
}
1 голос
/ 01 сентября 2011

«Другая форма» должна быть предоставлена ​​соответствующему экземпляру.Как-то так должно помочь.

public partial class TogglingForm : Form
{
    TogglingForm Other {get; set;}
    public TogglingForm()
    {
        InitializeComponent();
    }        

    private void HideOther_Click(object sender, EventArgs e)
    {
        Other.Visible = false;
    }

    private void ShowOther_Click(object sender, EventArgs e)
    {
        Other.Visible = true;
    }
}

....


static void Main()
{
   var first = new TogglingForm();
   var second = new TogglingForm {Other = first};
   first.Other = second;

   first.Show();
}   
0 голосов
/ 01 сентября 2011
namespace WindowsFormsApplication1 
{ 
public partial class Form2 : Form 
{ 
    Form1 frm1; 
    public Form2(Form1 frm1) 
    { 
        InitializeComponent(); 
        this.frm1 = frm1; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
        frm1.Visible = false; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
        frm1.Visible = true; 
    } 
} 
} 
0 голосов
/ 01 сентября 2011
0 голосов
/ 01 сентября 2011

Когда вы создаете экземпляр Form2 для объекта frm1, этот новый экземпляр создает другой экземпляр Form1, который создает новый экземпляр Form 2, который ...

Видите ли вы бесконечный цикл?

Создать один экземпляр друг друга в основном классе или в качестве глобальных переменных приложения. Или передать их в качестве параметра друг другу. .NET Framework будет просто ссылаться на них, не выделяя новое пространство памяти.

0 голосов
/ 01 сентября 2011

Вы создаете новый экземпляр каждой формы при создании другой формы.

Вместо этого вы должны заставить одну из форм взять экземпляр своей родительской формы в качестве параметра.

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