1

命名と列挙型の違いにより、単純にバインドすることはできません。次のことを考えました:

  • 変換された値の配列をデータソースとして使用します。
  • 列挙値と表示値の間で変換するためのformat/parseイベントを使用したプロパティのデータバインディング。

例:

BindingSource bs = new BindingSource();
bs.DataSource = this.testdata;

this.textBox1.DataBindings.Add("Text", this.bs, "CurrentState", true, DataSourceUpdateMode.OnPropertyChanged);
this.textBox1.ReadOnly = true;
this.comboBox1.DataSource = new List<string>() { "Goed", "Slecht", "Lelijk", "-" };
Binding b = new Binding("SelectedValue", this.bs, "CurrentState", true, DataSourceUpdateMode.OnPropertyChanged);
b.Parse += new ConvertEventHandler(TextToState);
b.Format += new ConvertEventHandler(StateToText);
this.comboBox1.DataBindings.Add(b);

[...]

   void StateToText(object sender, ConvertEventArgs e)
    {
        State state = (State)Enum.Parse(typeof(State), e.Value as string);

        switch (state)
        {
            case State.Good:
                e.Value = "Goed";
                break;
            case State.Bad:
                e.Value = "Slecht";
                break;
            case State.Ugly:
                e.Value = "Lelijk";
                break;
            default:
                e.Value = "-";
                break;
        }
    }

    void TextToState(object sender, ConvertEventArgs e)
    {
        switch (e.Value as string)
        {
            case "Goed":
                e.Value = State.Good;
                break;
            case "Slecht":
                e.Value = State.Bad;
                break;
            case "Lelijk":
                e.Value = State.Ugly;
                break;
            default:
                e.Value = State.None;
                break;
        }
    }

これは、機能をテストするための単なる例です。テキストボックスは、コンボボックスに表示される値が実際にデータバインドされたプロパティの値であることを確認するために使用されます。

このコードは機能します。ただし、回避できない問題が2つあります。

  • コンボボックスは、選択された項目が1回変更されるまで、データソースの最初の値(プロパティの状態ではない)を選択します。その後、バインディングは正常に機能します。
  • フォームを閉じることができません。

ロード時にバインディングが更新に失敗する理由がわかりません。バインディングなどをリセットしてみましたが、何も動作しません。また、フォームが閉じられない理由についてもわかりません。

4

1 に答える 1

2

使用したいキーと値のペアを含むクラスを作成してみませんか?これは、combobox1という名前のコンボボックスがあると仮定した小さな実装例です。

namespace WindowsFormsApplication1
{

   public enum State {None, Good, Bad, Ugly }

    public partial class Form1 : Form
    {
        List<StateTextPair> pairs;

        public Form1()
        {
            InitializeComponent();
            InitializeList();
            this.comboBox1.DataSource = pairs;
            this.comboBox1.ValueMember = "State";
            this.comboBox1.DisplayMember = "Name";
            this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
            ComboBox box = (ComboBox)sender;
            StateTextPair selected = (StateTextPair)box.SelectedItem;
            switch (selected.State) {
                case State.None:
                    // do nothing
                    break;
                default:
                    MessageBox.Show(selected.State.ToString() + " == " + selected.Name);
                    break;
            }
        }

        private void InitializeList() {
            pairs = new List<StateTextPair>();
            pairs.Add(new StateTextPair(State.None, " - Please select a value - "));
            pairs.Add(new StateTextPair(State.Good, "Goed"));
            pairs.Add(new StateTextPair(State.Bad, "Slecht"));
            pairs.Add(new StateTextPair(State.Ugly, "Lelijk"));
        }
    }

    public class StateTextPair {
        private string name;
        private State state;

        public State State { get { return state; } }
        public string Name { get { return name; } }

        public StateTextPair(State s, string n)
        {
            this.name = n;
            this.state = s;
        }
    }
}
于 2013-03-10T01:03:29.480 に答える