Невозможно использовать ComboBox SelectedItem в качестве BindingSource для каскадного ComboBox - PullRequest
0 голосов
/ 28 марта 2012

У меня есть 2 ComboBox на моей форме.Я создаю привязки следующим образом:

TestClass myclass = new TestClass("Instruments");

myclass.Add(instr1 = new TestClass("INSTR1"));
myclass.Add(instr2 = new TestClass("INSTR2"));
myclass.Add(instr3 = new TestClass("INSTR3"));
myclass.Add(instr4 = new TestClass("INSTR4"));

instr1.Add(app1 = new TestClass("app1"));
instr1.Add(app2 = new TestClass("app2"));
instr1.Add(app3 = new TestClass("app3"));
instr1.Add(app4 = new TestClass("app4"));

instr2.Add(app5 = new TestClass("app5"));
instr2.Add(app6 = new TestClass("app6"));
instr2.Add(app7 = new TestClass("app7"));
instr2.Add(app8 = new TestClass("app8"));

mysource = new BindingSource(myclass, null);
selectedComboBox1.DataSource = mysource;
selectedComboBox1.DisplayMember = "NAME";

mysource2 = new BindingSource(selectedComboBox1, "SelectedItem");
selectedComboBox2.DataSource = mysource2;
selectedComboBox2.DisplayMember = "NAME";

Класс, используемый для привязки, выглядит следующим образом

class TestClass : BindingList<TestClass>, INotifyPropertyChanged
{
    public event RunTestChanged RunTestChangedEventHandler;

    public TestClass()
    {
        this.test = "";
        this.name = "";
        this.runTest = true;
    }

    public TestClass(string name)
    {
        this.test = "";
        this.name = name;
        this.runTest = true;
    }

    public TestClass LIST
    {
        get
        {
            return this;
        }
    }

    public string NAME
    {
        get
        {
            return this.name;
        }
        set
        {
            this.name = value;
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("NAME"));
            }
        }
    }

    public string TEST
    {
        get
        {
            return this.test;
        }
        set
        {
            this.test = value;
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("TEST"));
            }
        }
    }


    public bool RUNTEST
    {
        get
        {
            return runTest;
        }
        set
        {
            runTest = value;
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("RUNTEST"));
            }
            RunTestArgs myargs = new RunTestArgs(value);

            if (RunTestChangedEventHandler != null)
            {
                RunTestChangedEventHandler(this, myargs);
            }
        }
    }


    private bool runTest;
    private string name;
    private string test;

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
}

при первой загрузке формы 2 поля со списком заполняются так, как должно быть сожидаемые предметы.Однако, если я изменяю элемент в selectedComboBox1, элементы в selectedComboBox2 не обновляются.Я знаю, что могу подписаться на событие selectedComboBox1 SelectedIndexChanged, а затем перепривязать DataSource к selectedComboBox2, и все будет работать так, как ожидается.

Например:

    void selectedComboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        mysource2.DataSource = selectedComboBox1.SelectedItem;
        mysource2.DataMember = null;
    }

Еще одна альтернатива, которая работает, - выполнитьпривязка данных выглядит следующим образом:

    mysource = new BindingSource(myclass, null);
    mysource2 = new BindingSource(mysource, "LIST");
    mysource3 = new BindingSource(mysource2, "LIST");

    selectedComboBox1.DataSource = mysource;
    selectedComboBox1.DisplayMember = "NAME";
    selectedComboBox2.DataSource = mysource2;
    selectedComboBox2.DisplayMember = "NAME";

Однако я хотел бы знать, есть ли способ избежать необходимости подписываться на событие или выполнять привязку данных другим способом и просто обновить 2-й ComboBox черезBindingSource с использованием свойства SelectedItem.В конце мне интересно узнать, как обновить BindingSource через привязку данных SelectedItem и, если это невозможно, что мешает ему работать.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 04 марта 2013

У меня возникла та же проблема, и я получил разрешение, связав Имя с SelectedValue из combobox и установив ValueMember в свойство " ИМЯ "

selectedComboBox1.DisplayMember = "NAME";

selectedComboBox1.ValueMember = "NAME";
...