C# フォーム間でのデータの受け渡し

Visual Studio でプログラム開発を行っていると、フォーム間でデータの受け渡しを行いたくなることが多々あります。この場合「つべこべ言わずにグローバル変数にすればいいだろう」という考え方もあるでしょうし、今まで VB.Net で開発を行ってきたときはグローバル変数を使うことが多くありました。

ただし、これは自分一人で開発を行ってきたプロジェクトに関してであり、自分がすべてのコードを完全に理解していたため可能だったという面もあります。一般的には複数のメンバーで開発するプロジェクトも多いでしょうし、そうなるとプログラムのどの部分からも変更でき、また変更を検知できないグローバル変数を使うのは好ましくないといえます。

また、VB.Net はまだいいとして C# で開発を行う際は以下の問題もあります。

  • C# にはグローバル変数がない(疑似的な方法はあるが)
  • C#er と言われる人たちは「変数のスコープはできるだけ狭くするべき」と考えているので、グローバル変数的な使い方をしていると間違いなく素人認定される

エンジニアとして活動していく上で素人認定されるのは誰でも嫌でしょうから、C# の場合は他の方法を使う必要があります。

参考までに、C# でのグローバル変数的な宣言は以下の通りになります。

public class GlobalVariables
{
    public static string project_name { get; set; }
}

これでプロジェクト中のすべてのクラスとフォームで文字列変数 “GlobalVariables.project_name” が使えます。

ただ、やはり格好が悪いしプロジェクトが大規模になれば不具合の温床になってしまう可能性があります。そこで、他の方法として送信側フォームで受信側フォームのインスタンスを作成し、受信側フォーム内の変数に代入するという方法があります。

送信側(親フォーム)を MainForm、受信側(子フォーム)を SubForm とし、MainForm に button1 と textBox1、SubForm に button2 と textBox2 を配置して各 Form のコードを以下のように記述します。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        using (SubForm subForm = new SubForm())
        {
            string transfer_string = textBox1.Text;
            subForm.transfer_string = transfer_string;

            subForm.ShowDialog(this);

            transfer_string = subForm.transfer_string;
            textBox1.Text = transfer_string;
        }
    }
}
public partial class SubForm : Form
{
    public string transfer_string;

    public SubForm()
    {
        InitializeComponent();
    }

    private void SubForm_Load(object sender, EventArgs e)
    {
        textBox2.Text = transfer_string;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        transfer_string = textBox2.Text;
        Close();
    }
}

プログラムを起動します。

MainForm (1)

textBox1 に適当な文字列(この例では “example-1″)を入力して button1 をクリックしてみます。

MainForm (2)

SubForm が起動し、textBox1 で入力した文字列が textBox2 に表示されていることが確認できます。

SubForm (1)

textBox2 の文字列を書き換えてみます。

SubForm (2)

button2 をクリックすると MainForm に戻り、textBox1 の文字列が変わっているのが確認できます。

MainForm (3)

これでグローバル変数を使わずにフォーム間でデータの受け渡しを行うことができます。受信側フォームのパブリック変数も使いたくないという場合はもっとスマートな方法があるのかもしれませんが、個人的にはこれで十分ではないかと考えています。この例では文字列変数を使いましたが、もちろん int や double でも同様に受け渡しが可能です。

VB.Net を習得してから C# にスキルを広げていくと、いろいろと発見があって面白いものです。複数の言語を覚えると世界が広がるので、エンジニアの方は需要がありそうな言語にいくつも挑戦することをお勧めします。