【问题标题】:Cannot use ComboBox SelectedItem as BindingSource for cascaded ComboBox不能将 ComboBox SelectedItem 用作级联 ComboBox 的 BindingSource
【发布时间】:2012-03-27 20:06:34
【问题描述】:

我的表单上有 2 个组合框。我按如下方式创建绑定:

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 事件,然后在 selectedComboBox2 上重新绑定 DataSource,一切都会按预期工作。

例如:

    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";

但是我想知道是否有办法避免订阅事件或以不同的方式执行数据绑定,而只需使用 SelectedItem 属性通过 BindingSource 更新第二个 ComboBox。最后,我很想知道如何通过 SelectedItem 数据绑定更新 BindingSource,如果不可能,是什么阻止了它工作。

感谢您的帮助。

【问题讨论】:

    标签: binding combobox selecteditem


    【解决方案1】:

    我有同样的问题,通过将名称绑定到 comboboxSelectedValue 并将 ValueMember 设置为“NAME”属性得到解决

    selectedComboBox1.DisplayMember = "NAME";
    
    selectedComboBox1.ValueMember = "NAME";
    

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2010-10-14
      • 2012-06-19
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多