【C#】DataBindingsについて

2023年2月27日

DataBindingsとは、Windowsフォームアプリケーションにおいて、データソースとコントロールを結びつけるための機能です。DataBindingsを使用することで、コントロールの値をデータソースに反映したり、データソースの変更を自動的に反映したりすることができます。

DataBindingsは、コントロールのDataBindingsプロパティを使用して設定されます。DataBindingsプロパティには、データソースのプロパティ名、データソースのオブジェクト、およびデータソースとコントロールの変換を指定するオプションのオブジェクトが含まれます。たとえば、TextBoxコントロールを使用してデータソースの値を表示する場合、以下のようにDataBindingsを設定することができます。

最初のコード(基本)

以下は、C#言語を使用したWindowsフォームアプリケーションで、DataBindingsとTextBoxを使用してデータを表示する簡単な例です。

まず、フォームにTextBoxコントロールを追加します。これを行うには、Visual Studioのデザイナーでフォームを開き、ツールボックスからTextBoxコントロールをドラッグしてフォームに配置します。

次に、データソースを作成します。この例では、Personクラスを使用します。

Personクラス

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Form1クラス

フォームには、上記のPersonクラスのインスタンスを作成し、初期情報を表示するボタンがあります。

public partial class Form1 : Form
{
    private Person person;

    public Form1()
    {
        InitializeComponent();

        // Personオブジェクトを初期化する
        person = new Person();
        person.Name = "山田";
        person.Age = 10;
    }

    private void UpdataButton_Click(object sender, EventArgs e)
    {
        // Personオブジェクトが更新されているのを確認する
        nameTextBox.Text = person.Name;
        ageTextBox.Text = person.Age.ToString();
    }
}

TextBoxのTextプロパティとPersonクラスのそれぞれのクラスをバインディングしたサンプル

クラス図

実行結果

名前を入力するTextBoxと年齢を入力するTextBoxがあります
入力するたびにpersonオブジェクトのプロパティが更新されます
それを確認するために、プロパティの更新確認ボタンをクリックするとプロパティの情報を表示するようなサンプルになります

フォームデザイン

ソリューション

クラス

personクラス

// INotifyPropertyChangedを実装したPersonクラスを定義する
public class Person : INotifyPropertyChanged
{
    // フィールドnameを宣言する(名前)
    private string name;
    // フィールドageを宣言する(年齢)
    private int age;

    // Nameプロパティを定義する
    public string Name
    {
        // nameフィールドの値を取得する(ゲッター)
        get { return name; }
        // nameフィールドの値を設定する(セッター)
        set
        {
            // valueはsetアクセサーに渡された値を表す予約語である
            name = value;
            // Nameプロパティが変更されたことを通知する
            OnPropertyChanged(nameof(Name));
        }
    }

    // Ageプロパティを定義する
    public int Age
    {
        // ageフィールドの値を取得する(ゲッター)
        get { return age; }
        // ageフィールドの値を設定する(セッター)
        set
        {
            // valueはsetアクセサーに渡された値を表す予約語である
            age = value;
            // Ageプロパティが変更されたことを通知する
            OnPropertyChanged(nameof(Age));
        }
    }

    // PropertyChangedイベントを定義する
    public event PropertyChangedEventHandler PropertyChanged;

    // プロパティが変更されたことを通知するメソッドを定義する
    protected virtual void OnPropertyChanged(string propertyName)
    {
        // PropertyChangedイベントを発生させる
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

このクラスは、C#のオブジェクト指向プログラミングにおいて、プロパティ変更通知のために使用される標準的なパターンである「INotifyPropertyChanged」インターフェースを実装した、Personという名前のクラスです。

このクラスには、NameとAgeという2つのプロパティがあります。それぞれのプロパティは、値が変更されるとPropertyChangedイベントを発生させます。これにより、UIなどの別のオブジェクトがこれらの変更を検知し、自動的に反映することができます。

具体的には、プロパティのsetアクセサー内で、プロパティが更新されたことを示すOnPropertyChangedメソッドを呼び出しています。このメソッドは、PropertyChangedイベントを発生させ、変更されたプロパティ名をイベント引数として渡しています。

また、PropertyChangedイベントを処理するために、PropertyChangedEventHandlerデリゲート型を使用し、PropertyChangedイベントを購読するために、INotifyPropertyChangedインターフェースを実装しています。

このように、Personクラスは、プロパティ変更通知を実装することで、C#のバインディング機能を使用したデータバインディングやMVVMパターンなど、さまざまなシナリオで利用されます。

Form1クラス

public partial class Form1 : Form
{
    private Person person;

    public Form1()
    {
        InitializeComponent();

        // Personオブジェクトを初期化する
        person = new Person();

        // データバインディングを設定する
        textBox1.DataBindings.Add("Text", person, "Name");
        textBox2.DataBindings.Add("Text", person, "Age");
    }

    private void UpdataButton_Click(object sender, EventArgs e)
    {
        // Personオブジェクトが更新されているのを確認する
        nameTextBox.Text = person.Name;
        ageTextBox.Text = person.Age.ToString();
    }
}

このコードは、WindowsフォームアプリケーションのフォームクラスであるForm1を定義しています。

まず、Personオブジェクトを初期化し、textBox1とtextBox2のTextプロパティと、PersonオブジェクトのNameとAgeプロパティをデータバインディングで結びつけています。つまり、textBox1とtextBox2のTextプロパティが変更されると、PersonオブジェクトのNameとAgeプロパティの値も変更されます。

次に、UpdataButton_Clickイベントハンドラーでは、Personオブジェクトが更新されているかどうかを確認するために、personオブジェクトのNameとAgeプロパティの値をそれぞれnameTextBoxとageTextBoxのTextプロパティに設定しています。このボタンは更新のトリガーにしかなっておらず、実際の更新はTextBoxのテキストが変更されたタイミングで自動的に行われるようになっています。

C#,学習

Posted by hidepon