ComboBox становится пустым после обновления привязки данных, даже если данные обновляются успешно - PullRequest
3 голосов
/ 10 января 2010

У меня проблема с настройкой ComboBox для нормальной работы при привязке данных, и я не уверен, где проблема.

В приведенном ниже коде создается ComboBox, которому присваивается список значений с привязкой к данным, а затем данные привязываются к форме. Идея состоит в том, что ComboBox должен отображать список опций, а когда он выбран, он должен обновлять источник данных и указываться в текстовом поле статуса.

Все это, кажется, работает правильно, за исключением того, что ComboBox становится пустым после обновления значения, чего я не понимаю.

Когда тип данных свойства «Selection» изменяется с Int32 на string, он работает точно так, как ожидается. Однако, как Int32, поле становится пустым, даже если оно правильно устанавливает значение.

Буду признателен за любую помощь в понимании, как решить эту проблему.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ComboboxDatabindingTest
{
    public partial class Form1 : Form
    {
        ComboBox _box;
        TextBox _status;
        ValuesDataSource _bsValues;
        BindingSource _bsObject;
        Binding _binding;
        int _selection;

        public Form1()
        {
            _selection = 0;

            _bsValues = new ValuesDataSource();

            _bsObject = new BindingSource();
            _bsObject.DataSource = this;

            _status = new TextBox();
            _status.Left = 20;
            _status.Top = 50;
            _status.Width = 200;
            _status.ReadOnly = true;

            _box = new ComboBox();
            _box.Name = "box";
            _box.Left = 20;
            _box.Top = 20;
            _box.Width = 200;
            _box.DropDownStyle = ComboBoxStyle.DropDownList;
            _box.ValueMember = "CodeOrLabel";
            _box.DisplayMember = "Label";
            _box.DataSource = _bsValues;
            _binding = _box.DataBindings.Add("SelectedValue", _bsObject, "Selection");

            this.Controls.Add(_box);
            this.Controls.Add(_status);
        }

        public int Selection
        {
            get { return _selection; }
            set { _selection = value; _status.Text = value.ToString(); }
        }
    }

    public class Value
    {
        private string _code = null;
        private string _label = "";

        public Value(string code, string label)
        {
            _code = code;
            _label = label;
        }

        public string Code
        {
            get { return _code; }
        }

        public string Label
        {
            get { return _label; }
        }

        public string CodeOrLabel
        {
            get { return _code == null ? _label : _code; }
        }
    }

    public class ValuesDataSource : BindingList<Value>
    {
        public ValuesDataSource()
        {
            base.Add(new Value("1", "California"));
            base.Add(new Value("2", "Nevada"));
            base.Add(new Value("3", "Arizona"));
            base.Add(new Value("4", "Oregon"));
        }
    }
}

1 Ответ

2 голосов
/ 10 января 2010

Меня не удивляет, что это изо всех сил. При связывании SelectedValue он попытается найти соответствие (что означает Equals) между ValueMember каждого (т.е. CodeOrLabel) и связанным свойством (Selection). Но никогда верно (например) "123".Equals(123), поэтому это никогда не будет совпадать. Таким образом, по-видимому, решается, что не выбранный элемент (так как ни один не соответствует).

В основном, используйте string здесь или используйте int повсюду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...