朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
.Net フォーム間でのデータの受け渡し





フォーム間でのデータの受け渡しについてどのようにするのかという質問が多いように思われる。タイプとしては、あるフォームで入力したデータを、そのフォームが閉じた時に取得するというものと、 あるフォームを開いたままで、別のフォームが任意のタイミングで取得するというものがある。順番にサンプルコードを提示したいと思う。

1.フォームを閉じたタイミングで更新

C#

    //Form2からForm3を呼び出し、Form3からForm2にデータをコピーします。
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        public string TestText
        {
            set 
            { 
                //テキストボックスに書き込む
                this.textBox1.Text = value; 
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form3 frm = new Form3();
            //Form2をオーナーフォームに指定しておく
            frm.ShowDialog(this);
        }
    }

    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //渡したいフォームを取得
            Form2 frm = this.Owner as Form2;
            //渡したいデータを書き込む
            frm.TestText = this.textBox1.Text;
            this.Close();
        }
    }

VB.NET

'Form2からForm3を呼び出し、Form3からForm2にデータをコピーします。
Public Class Form2
    Public WriteOnly Property TestText() As String
        Set(ByVal value As String)
            'テキストボックスに書き込む
            Me.TextBox1.Text = value
        End Set
    End Property
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As Form3 = New Form3()
        'Form2をオーナーフォームに指定して開く
        frm.ShowDialog(Me)
    End Sub
End Class

Public Class Form3
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '渡したいフォームを取得
        Dim frm As Form2 = CType(Me.Owner, Form2)
        '渡したいデータを書き込む
        frm.TestText = Me.TextBox1.Text
        Me.Close()
    End Sub
End Class

2.任意のタイミングで別フォームのデータを取得

C#

    //Form4からForm5を呼び出し、Form5からForm4にデータをコピーします。
    public partial class Form4 : Form
    {
        //入力するフォームの変数を用意しておく
        Form5 _frm;
        public Form4()
        {
            InitializeComponent();
            _frm = new Form5();
            //フォームを表示するが、モーダル表示にしてはいけない。
            _frm.Show();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //データをコピーする
            this.textBox1.Text = _frm.TestText;
        }
    }

    public partial class Form5 : Form
    {
        public Form5()
        {
            InitializeComponent();
        }
        public string TestText
        {
            get { return this.textBox1.Text; }
        }
    }

VB.NET

'Form4からForm5を呼び出し、Form5からForm4にデータをコピーします。
Public Class Form4
    '入力するフォームの変数を用意しておく
    Private _frm As Form5
    Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _frm = New Form5()
        'フォームを表示するが、モーダル表示にしてはいけない。
        _frm.Show()
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'データをコピーする
        Me.TextBox1.Text = _frm.TestText
    End Sub
End Class

Public Class Form5
    Public ReadOnly Property TestText() As String
        Get
            Return Me.TextBox1.Text
        End Get
    End Property
End Class








良いやや良い普通やや悪い悪い
6 2 14 3 22

投稿日時評価コメント
2023/04/01 管理人 ご質問ありがとうございます。 答えは、Form2にpublicなプロパティを作成しておきます。 Form1でボタンをクリックしたら、Form2のインスタンスをnewして、そのForm2のインスタンスをShowする前に、先程のForm2のpublicなプロパティにデータを書き込んで、Form2をShowすると渡せます。 お返事遅れまして申し訳ありません。
2023/03/27 良い Form2で入力したデータをForm1に受け渡す機能は分かりましたが、逆にForm1で入力したデータをForm2に受け渡すにはどうしたらよいでしょうか。
2021/12/12 管理人 管理人です。ご指摘ありがとうございます。 VS2022でサンプルプログラムを作って行ってみたのですが、きちんとデータの受け渡しができます。 サンプルでは特に初期値は指定してないのですが、たとえ初期値を指定していても、現在の値が受け渡しされます。 もしよろしければ、バグ報告・要望の方で、作成してみたコードを教えていただければと思います。 よろしくお願いします。
2021/12/11 やや悪い 辛辣かもしれませんが多分これって現在のFormに格納されているデータを返却するではなく初期値を返却してるように思えるのですが… 自分の場合Form1から任意のタイミングでForm2のテキストボックスに格納されている情報を読み込むという中身ですが、Form1にて読み込もうとする際にForm2の現在情報ではなくForm2ga作成時に格納されている情報が返却されたのですが…
2020/12/09 管理人 管理人です。ご提案ありがとうございます。考えてみたいと思います。
2020/12/08 普通 文言だけでは具体的な形がわかりにくいので、Form画面を表示していただけるとよりわかりやすくなると思います
2020/12/08 普通 文言だけでは具体的な形がわかりにくいので、Form画面を表示していただけるとよりわかりやすくなると思います
2020/09/19 管理人 管理人です。ありがたいご指摘ありがとうございます。 早速変更しました。 他にもあればご指摘よろしくお願いします。
2020/09/19 悪い わからないです。 このコードではどこのフォームからどこのフォームに値を受け渡すのかが明記されていないので、初心者の私にとっては非常に理解に苦しみます。
2019/04/04 管理人 ご指摘ありがとうございます。 しかし、上記のサンプルではプロパティを介してのデータを受け渡しているだけで、別フォームをコントロールしているわけではありません。
2019/04/01 普通 上記の例は「フォーム間でのデータの受け渡し」ではなく、「他フォームのコントロールを操作・設定する」ではないでしょうか?
2017/01/18 管理人 開発環境と言語はなんでしたでしょうか?
2017/01/17 悪い 書いたとおりにしてもできませんでした.