1

顧客オブジェクトからコンボボックスまでのDataBindingsを使用しています。私が達成しようとしている動作は、ラベルテキストが選択された名前を反映することです。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
  public partial class Form1 : Form
  {
    Customer selectedCustomer;
    List<Customer> list = new List<Customer>();

    public Form1()
    {
        InitializeComponent();
        selectedCustomer = new Customer() { Id = 2, FirstName = "Jane" };
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        label1.Text = selectedCustomer.FirstName;
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        list.Add(new Customer() { Id = 1, FirstName = "John" });
        list.Add(new Customer() { Id = 2, FirstName = "Jane" });

        comboBox1.DisplayMember = "FirstName";
        comboBox1.ValueMember = "Id";
        comboBox1.DataSource = list;
        comboBox1.DataBindings.Add("Text", selectedCustomer, "FirstName");
    }
  }

  public class Customer
  {
      public int Id { get; set; }
      public string FirstName { get; set; }
  }
}
4

1 に答える 1

2

selectedCustomer選択したアイテムをフィールドに割り当てる必要があります。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    selectedCustomer = (Customer)comboBox1.SelectedItem;
    label1.Text = selectedCustomer.FirstName;
}

ラベルテキストを自動的に変更する場合は、ラベルのデータバインディングを追加する必要があります(現在、コンボボックスに追加しています)。

label1.DataBindings.Add("Text", selectedCustomer, "FirstName");

ただし、テキストも更新されません。なんで?ラベルは顧客の特定のインスタンスにバインドされているため(バインドの追加時に1つ)、ラベルはバインドされている顧客の変更を反映します。

selectedCustomer.FirstName = "Serge";

しかし、繰り返しになりますが、顧客の名前を変更しても何も起こりません。なんで?顧客はINotifyPropertyChangedインターフェースを実装し、名前の変更についてラベルに通知するイベントを発生させる必要があるため:

public class Customer : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _firstName;

    public int Id { get; set; }

    public string FirstName 
    { 
        get { return _firstName; } 
        set 
        { 
            _firstName = value; // well, it's better to check if value changed
            if (PropertyChanged !=null) 
                PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
        }
    }        
}

これで、選択した顧客の名前を変更すると、新しい値がラベルに表示されます。これが、WinFormでのデータバインディングの仕組みです。

于 2012-12-21T00:27:44.710 に答える