0

私はC#を初めて使用します。この質問はよくある質問ですが、本当に時間がかかります。このシナリオでは、プロジェクトをさらに進めることはできません。

必要なのは、form1 のメソッドを button_Click イベントで呼び出して、form2 リストビューから form1 テキストボックスに値を渡したいだけです。一方、コードをトリガーするボタンをクリックすると、何も表示されません。

遭遇した問題:

1: Form1 f1 = New Form1() を宣言すると、コンパイラは Form2 の Button_Click イベントでメソッドが呼び出されるコードをコンパイルします。しかし、ボタンをクリックしても、テキストボックスには何も変化がありません。

2: Form1 を Public Form1 f1; として宣言し、ボタンをクリックすると NullReferenceException が発生します。

3: Form2 を ShowDialog(); として表示する必要があります。

どんな助けでも大歓迎です。

Form1 の私のコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Threading;

namespace Practice_CS
{
    public partial class Form1 : Form
    {  

        public Form1()
        {
            InitializeComponent();
        }

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

        public void setFields(string sName,string sAge,string sGender) {
            txtName.Text  = sName;
            txtAge.Text  = sAge;
            txtGender.Text  = sGender;        
        }



    }
}

Form2 の私のコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Practice_CS
{
    public partial class Form2 : System.Windows.Forms.Form
    {        

        public Form2()
        {
            InitializeComponent();            
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            lvlist.Items.Add("Juli");
            lvlist.Items[0].SubItems.Add("20");
            lvlist.Items[0].SubItems.Add("Male");

            lvlist.Items.Add("Mark");
            lvlist.Items[1].SubItems.Add("21");
            lvlist.Items[1].SubItems.Add("Male");

            lvlist.Items.Add("Shiela");
            lvlist.Items[2].SubItems.Add("18");
            lvlist.Items[2].SubItems.Add("Female");

        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            if (lvlist.Items.Count < 1) { return; }

            Form1 f1 = new Form1();
            f1.setFields(lvlist.FocusedItem.Text, lvlist.FocusedItem.SubItems[1].Text,     lvlist.FocusedItem.SubItems[2].Text);
            this.Close();
        }

        private void lvlist_DoubleClick(object sender, EventArgs e)
        {
            btnSelect_Click(btnSelect, e); 
        }

    }
}
4

6 に答える 6

1

この問題 (フォームをモーダル ダイアログとして呼び出す場合) に対する自然なアプローチは、form2 のパブリック プロパティを介して form1 に戻される値を保存することです。

したがって、form2 でこれらのプロパティを宣言し、フォームを閉じるときに内部的に設定します。

public string Name {get; private set;}
public string Age {get; private set;}
public string Gender {get; private set;}

private void btnSelect_Click(object sender, EventArgs e)
{
    if (lvlist.Items.Count < 1) { this.DialogResult = DialogResult.None; return; }
    this.Name = lvlist.FocusedItem.Text;
    this.Age = lvlist.FocusedItem.SubItems[1].Text;
    this.Gender = lvlist.FocusedItem.SubItems[2].Text;
    this.DialogResult = DialogResult.OK;  
}

今あなたのフォームで1

private void btnViewList_Click(object sender, EventArgs e)
{
    using(Form2 f2 = new Form2())
    {
        if(DialogResult.OK == f2.ShowDialog())
        {
            // At this point f2 is still in memory but it is hidden
            // You could read the public properties exposed by the Form2
            string name = f2.Name;
            string age = f2.Age;
            string gender = f2.Gender;
        }
    } // <- At this point the f2 instance is closed and ready for GC 
}

この方法には、Form1 の存在から Form2 の機能を切り離すという利点があります。
Form2 コンストラクターを変更したり、別のコンストラクターを追加したりしてから、Form2 のコード内でテストして、現在のクライアントが Form2 の機能を必要としているものを特定する必要はありません。

このようにして、Form1 のインスタンスにバインドすることなく、必要な場所に Form2 のインスタンスを作成できます。

于 2013-06-04T13:00:40.287 に答える