1

次のコードで:

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

namespace BindingSourceSimpleTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class Color
        {
            public string Name { get; set; }
            public int Red { get; set; }
            public int Green { get; set; }
            public int Blue { get; set; }
        }

        public class Obj
        {
            public string Name { get; set; }
            public string Color { get; set; }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var colors = new List<Color>();
            colors.Add(new Color { Name = "Black", Red = 0, Green = 0, Blue = 0 });
            colors.Add(new Color { Name = "Blue", Red = 0, Green = 0, Blue = 255 });
            colors.Add(new Color { Name = "Red", Red = 255, Green = 0, Blue = 0 });
            colors.Add(new Color { Name = "Magenta", Red = 255, Green = 0, Blue = 255 });
            colors.Add(new Color { Name = "Green", Red = 0, Green = 255, Blue = 0 });
            colors.Add(new Color { Name = "Cyan", Red = 0, Green = 255, Blue = 255 });
            colors.Add(new Color { Name = "Yellow", Red = 255, Green = 255, Blue = 0 });
            colors.Add(new Color { Name = "White", Red = 255, Green = 255, Blue = 255 });

            var objs = new List<Obj>();
            objs.Add(new Obj { Name = "Sun", Color = "Yellow" });
            objs.Add(new Obj { Name = "Grass", Color = "Green" });
            objs.Add(new Obj { Name = "Blood", Color = "Red" });
            objs.Add(new Obj { Name = "Sky", Color = "Blue" });
            objs.Add(new Obj { Name = "Hair", Color = "Black" });
            objs.Add(new Obj { Name = "Snow", Color = "White" });
            objs.Add(new Obj { Name = "Rose", Color = "Red" });

            listBoxObjs.DataSource = new BindingSource(objs, null);
            listBoxColors.DataSource = new BindingSource(colors, null);
            comboBoxObjColor.DataSource = new BindingSource(colors, null);

            textBoxObjName.DataBindings.Add("Text", listBoxObjs.DataSource, "Name");
            comboBoxObjColor.DataBindings.Add("SelectedItem", listBoxObjs.DataSource, "Color");
            textBoxColorName.DataBindings.Add("Text", listBoxColors.DataSource, "Name");
            textBoxColorRed.DataBindings.Add("Text", listBoxColors.DataSource, "Red");
            textBoxColorGreen.DataBindings.Add("Text", listBoxColors.DataSource, "Green");
            textBoxColorBlue.DataBindings.Add("Text", listBoxColors.DataSource, "Blue");

            listBoxObjs.DisplayMember = listBoxColors.DisplayMember = comboBoxObjColor.DisplayMember = "Name";
        }
    }
}

および次のフォーム UI:

フォーム1
(出典: persiangig.com )

  1. 太陽が黒いのが分かります!どうして?!詳しく見てみると、色のリストの項目は Color 型であるのに対し、オブジェクトの Color プロパティは string 型であることがわかりました。
  2. オブジェクトの Color プロパティがコンボボックスに正しく表示されるようにするにはどうすればよいですか?
  3. これを修正すると、コンボボックスの選択を変更すると、オブジェクトのこのプロパティも正しく更新されますか?
  4. これを修正すると、太陽が黄色くなりますか? :)

ありがとう

4

1 に答える 1

0

Obj リストにカラー オブジェクトへの参照がないようです。文字列の Color プロパティがありますが、Color リストの Color オブジェクトとの関係はありません。

    public class Obj
    {
        public string Name { get; set; }
        public BindingSourceSimpleTest.Color Color { get; set; }
    }

また、データバインディングが適切に機能するように、クラスは INotifyPropertyChanged インターフェイスを実装する必要があります。

public class Obj : INotifyPropertyChanged {
  public event PropertyChangedEventHandler PropertyChanged;

  private string name;
  private BindingSourceSimpleTest.Color color;

  protected void OnPropertyChanged(string propName) {
    if (PropertyChanged != null) {
      PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
  }

  public string Name {
    get { return name; }
    set {
      name = value;
      OnPropertyChanged("Name");
    }
  }

  public BindingSourceSimpleTest.Color Color {
    get { return color; }
    set {
      color = value;
      OnPropertyChanged("Color");
    }
  }
}
于 2012-08-10T14:21:58.980 に答える