0

C# で複数のフォームを使用する方法を理解するのに役立つ、非常に単純なプログラムがあります。Form1( form1 ) と Form2( form2 ) があります。form1 には、ボタン、ラベル、およびシリアル ポートがあります。form2 には、ボタンとラベルがあります。プログラムが行うことは、ボタンをクリックするとフォームが閉じ、他のフォームが開き、ラベルのテキストが変更され、BaudRate が変更されることです。form1 のコードは次のとおりです。

public partial class Form1 : Form
{
    //Making a refernce of Form2 called 'form2'.
    Form2 form2 = new Form2();

    public Form1()
    {
        InitializeComponent();
    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Able to reference form2 in a style that replicated VB.NET
        form2.Show();
        this.Hide();
        form2.label2.Text = ("Hello2");
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        label1.Text = ("Start!");
        ApplicationPort.BaudRate = 200;
    }

form2 のコードは次のとおりです。

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Declaring the new instance of Form1 called 'form1'.
        var form1 = new Form1();     
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }

    public void Form2_Load(object sender, EventArgs e)
    {
        //Declaring the new instancce for Form1 called 'form1'.
        var form1 = new Form1();
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());

    }
}

何が起こっているのか、プログラムを開始すると BaudRate は200になります。ボタンをクリックして 2 番目のフォームが開くと、load イベントでメッセージ ボックスに BaudRateがデフォルト値の9600として表示されます。次に、form2 のボタンをクリックすると、メッセージ ボックスに元の BaudRate の200が表示されます。Load イベント ハンドラが値を取得していないのはなぜですか? 私は参照を書いていますか、それとも何か間違っていますか?Visual Studio 2010 Express WinForms を使用しています。

4

3 に答える 3

2
    var form1 = new Form1();
    MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());

これにより、すべての設定がデフォルト値に設定される新しいインスタンスが作成されます。Form1

Form1オブジェクトの既存のインスタンスを新しく作成されたオブジェクトに渡す必要がありForm2ます。

public partial class Form2 : Form
{
    Form1 form1;
    public Form2(Form1 frm)
    {
        form1 = frm;
        InitializeComponent();

    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Declaring the new instance of Form1 called 'form1'.
        //var form1 = new Form1();     
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }

    public void Form2_Load(object sender, EventArgs e)
    {
        //Declaring the new instancce for Form1 called 'form1'.
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());

    }
}

public partial class Form1 : Form
{
    //Making a refernce of Form2 called 'form2'.
    Form2 form2; // Pass the instance of this object to Form2!

    public Form1()
    {
        form2 = new Form2(this)
        InitializeComponent();
    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Able to reference form2 in a style that replicated VB.NET
        form2.Show();
        this.Hide();
        form2.label2.Text = ("Hello2");
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        label1.Text = ("Start!");
        ApplicationPort.BaudRate = 200;
    }
于 2013-08-12T21:01:28.400 に答える
1

Form2 から Form1 の新しいインスタンスを作成しています。Form1 を Form2 コンストラクターに渡すことができます。

public partial class Form2 : Form
{
    Form1 form1;

    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
    }

    public void button1_Click(object sender, EventArgs e)
    {    
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }
}
于 2013-08-12T21:02:50.777 に答える