【C#】WindowsFormsアプリで画面から入力した値でDictionary型のデータを作成する

フォーム画面でキーとバリュー(値)を入力して、登録ボタンを押下するとDictionary型のデータとして追加(Add)されるコードの制作を見ていきましょう

また、その過程を通じてクラス、継承の仕組みを学習してみましょう

デザイン画面

コード

注意)抜粋です。単純に全コードをコピペしても動作しませんので。。。

Dictionary<string, string> phoneBook = new Dictionary<string, string>();

private void button1_Click(object sender, EventArgs e)
{
    string key = textBox1.Text;
    string value = textBox2.Text;

    phoneBook[key] = value;
}

C#プログラミング言語を使用して、電話帳のエントリを作成するための簡単な例です。コードの詳細な説明を以下に示します。

  1. 最初の行では、Dictionary<string, string>型のphoneBookという名前の変数が宣言されています。これは、文字列型のキーと値をペアとして持つ電話帳を表すものです。電話帳は、名前(キー)と電話番号(値)の関連付けを保持します。
  2. private void button1_Click(object sender, EventArgs e)は、ボタンがクリックされたときに実行されるイベントハンドラを定義しています。これは、ボタンをクリックしたときに実行されるコードをまとめるためのものです
  3. メソッドの中で、2つの文字列変数 keyvalue が宣言されています。これらの変数は、ユーザーがテキストボックスに入力した名前と電話番号を一時的に保持します。
  4. phoneBook[key] = value; この行は、ユーザーが入力した名前(key)と電話番号(value)を、phoneBook 電話帳に関連付けて保存するための操作です。電話帳は、名前(キー)と電話番号(値)の組み合わせを保持し、ユーザーが名前を検索すると、対応する電話番号を提供することができます。

要するに、このコードは、ユーザーが名前と電話番号を入力し、それを電話帳に追加するためのものです。電話帳は名前と電話番号のペアを保存し、必要なときにそれを取得することができます

参考(学習のため)

変数の宣言がない?

上記のDictionary型の変数への代入で、例えば textBox1変数って

宣言されていないんじゃないの?宣言しなくても使えるよね?C#では宣言が必要って言ってたけど要らないんじゃない?

って思われた方!!!必見です

後に添付されている初期化メソッドから次が抜粋されます
練習のためにどこに隠れているか探してください

確かに宣言していますし、TextBoxクラスのインスタンス(実体)が作成されているのがわかります

TextBox textBox1;
textBox1 = new TextBox();

プロパティへのアクセス(代入・読み取り)の方法

サンプルの次のコードは何を意味するのでしょうか?
C#では、=記号の右辺の値を左辺の変数に代入(割当)すると決められています
Textプロパティ(属性)を読み取ってkey変数に代入する事になリます

string key = textBox1.Text;

ここでTextBoxクラスを覗いてみましょう
Textプロパティが見つかりました
どうも読み取りの時は(getキーワードのブロック)base.Textの値を戻り値としているようです

ここで、baseとはなんでしょうか?
これは、継承元(基底クラス)を指します

public class TextBox : TextBoxBase
{
    //
    // 概要:
    //     このコントロールに関連付けられているテキストを取得または設定します。
    //
    // 戻り値:
    //     このコントロールに関連付けられたテキスト。
    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            base.Text = value;
            selectionSet = false;
        }
    }
}

TextBoxクラスの継承元(基底クラス)

なんと、さらにbase.Text(継承元のプロパティを戻り値とすることになっていますね

public abstract class TextBoxBase : Control
{
    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            if (value != base.Text)
            {
                base.Text = value;
                if (base.IsHandleCreated)
                {
                    SendMessage(185, 0, 0);
                }
            }
        }
    }
}

TextBoxBaseクラスの継承元(基底クラス)

ここで、ようやく取得するコードに出会えましたね
長くなるので、setキーワード側は省略しています

public class Control : Component
{
    public virtual string Text
    {
        get
        {
            if (CacheTextInternal)
            {
                if (text != null)
                {
                    return text;
                }

                return "";
            }

            return WindowText;
        }
        set
        {
        }
    }
}

クラス図

TextBoxクラスのTextプロパティから辿っていった継承関係
base.Text・・・を繰り返しています
実態としては、Controlクラスに宣言されているプロパティから取得しているようですね

参考)Form1クラスのコンストラクタから呼ばれる初期化のメソッド

namespace DictionaryAddSamp_e
{
    partial class Form1
    {
        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(595, 217);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(168, 217);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 19);
            this.textBox1.TabIndex = 1;
            // 
            // textBox2
            // 
            this.textBox2.Location = new System.Drawing.Point(350, 216);
            this.textBox2.Name = "textBox2";
            this.textBox2.Size = new System.Drawing.Size(100, 19);
            this.textBox2.TabIndex = 2;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.TextBox textBox2;
    }
}

おまけ

実用的なコード

単純に全てをコピペしてもダメですので。。。

初期に設定される変数名をわかりやすい名前に変更しています
変更の方法は、例えば、textBox1の場合

  1. textBox1を右クリックしてメニューから「名前の変更」を選択します
  2. ウィンドウが開くので、nameとします
  3. textBox1変数が使われているすべての箇所がname変数に変更されます
using System;
using System.Windows.Forms;
using System.Collections.Generic;

namespace PhoneBookApp
{
    public partial class MainForm : Form
    {
        // 電話帳のデータを保持する辞書
        private Dictionary<string, string> phoneBook = new Dictionary<string, string>();

        public MainForm()
        {
            InitializeComponent();
        }

        private void addButton_Click(object sender, EventArgs e)
        {
            // 名前と電話番号のテキストボックスから入力を取得
            string name = nameTextBox.Text;
            string phoneNumber = phoneNumberTextBox.Text;

            if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(phoneNumber))
            {
                // 名前と電話番号が両方とも入力されている場合
                // 電話帳にエントリを追加する
                phoneBook[name] = phoneNumber;

                // 入力が成功したら、テキストボックスをクリアして準備する
                nameTextBox.Clear();
                phoneNumberTextBox.Clear();

                // メッセージボックスを表示して成功を伝える
                MessageBox.Show("エントリが電話帳に追加されました。", "追加済み", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                // 名前か電話番号が未入力の場合、エラーメッセージを表示する
                MessageBox.Show("名前と電話番号の両方を入力してください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}