我是数据绑定的新手。
我有这些课程:
public class Foo : List<Bar>
{
public string FooName { get; set; }
}
public class Bar
{
public string BarName { get; set; }
public string BarDesc { get; set; }
}
我有List<Foo>
我希望Foo
中的ComboBox
项和Bar
中的ListBox
项。当我更改ComboBox
中的所选项目时,我希望ListBox
更改。当我更改ListBox
中的所选项目时,我希望TextBox
填充BarDesc
。
以下内容仅适用于ListBox
和ComboBox
:
comboBox1.DataSource = foos;
comboBox1.DisplayMember = "FooName";
listBox1.DataBindings.Add("DataSource", foos, "");
listBox1.DisplayMember = "BarName";
我现在不知道如何将Bar
中选定的ListBox
绑定到TextBox.Text
属性。也许为listBox1
添加绑定不是一个好主意。
也许我应该这样做:
((CurrencyManager)listBox1.BindingContext[foos]).CurrentChanged += new EventHandler((o, a) =>
{
textBox1.DataBindings.Clear();
textBox1.DataBindings.Add("Text", listBox1.DataSource, "BarDesc");
});
如何解决我的问题?
答案 0 :(得分:17)
为了完成所有这些工作,我必须将Items
属性添加到Foo
类。这是两个绑定源之间的“链接/关系”。
public partial class Form1 : Form {
public class Foo : List<Bar> {
public string FooName { get; set; }
public Foo(string name) { this.FooName = name; }
public List<Bar> Items { get { return this; } }
}
public class Bar {
public string BarName { get; set; }
public string BarDesc { get; set; }
public Bar(string name, string desc) {
this.BarName = name;
this.BarDesc = desc;
}
}
public Form1() {
InitializeComponent();
List<Foo> foos = new List<Foo>();
Foo a = new Foo("letters");
a.Add(new Bar("a", "aaa"));
a.Add(new Bar("b", "bbb"));
foos.Add(a);
Foo b = new Foo("digits");
b.Add(new Bar("1", "111"));
b.Add(new Bar("2", "222"));
b.Add(new Bar("3", "333"));
foos.Add(b);
//Simple Related Object List Binding
//http://blogs.msdn.com/bethmassi/archive/2007/04/21/simple-related-object-list-binding.aspx
BindingSource comboBoxBindingSource = new BindingSource();
BindingSource listBoxBindingSource = new BindingSource();
comboBoxBindingSource.DataSource = foos;
listBoxBindingSource.DataSource = comboBoxBindingSource;
listBoxBindingSource.DataMember = "Items";
comboBox1.DataSource = comboBoxBindingSource;
comboBox1.DisplayMember = "FooName";
listBox1.DataSource = listBoxBindingSource;
listBox1.DisplayMember = "BarName";
textBox1.DataBindings.Add("Text", listBoxBindingSource, "BarDesc");
}
}
答案 1 :(得分:0)
使用BindingSource满足您所有复杂的数据绑定需求:
// bind to List<Foo>
BindingSource comboBoxBindingSource = new BindingSource();
comboBoxBindingSource.DataSource = foos;
// use this binding source in comboBox1
// for display use FooName
comboBox1.DataSource = comboBoxBindingSource;
comboBox1.DisplayMember = "FooName";
// bind to comboBox1's SelectedValue
// it will point to the Foo selected in combobox
BindingSource listBoxBindingSource = new BindingSource();
listBoxBindingSource.DataSource = comboBox1;
listBoxBindingSource.DataMember = "SelectedValue";
// use this binding source in listBox1
// for display use BarName
listBox1.DataSource = listBoxBindingSource;
listBox1.DisplayMember = "BarName";
// bind to comboBox'1s SelectedValue (reusing listBoxBindingSource)
// and set Text to value of BarDesc
textBox1.DataBindings.Add("Text", listBoxBindingSource, "BarDesc");
答案 2 :(得分:0)
您应该在组合和列表框中设置ValueMember。您可能还需要处理bindingSource.CurrentChanged并将列表框重新绑定到当前选定的列表。
答案 3 :(得分:0)
关于继承与构成的主题。
你实际上在说&#34; Foo是一个名字为#34;的酒吧列表,当它更简单时说&#34; Foo有一个名字并且有一个名单&#34; ;。但是为什么?
如果你想让Foo有两个列表怎么办?还是列表和字典? C#不允许多重继承(它本身很脏!),所以你必须去创建另一个包含多个数据结构的类。
另外,由于继承,你必须创建一个&#34; Items&#34;返回自己的方法,不必要的代码。
试试这个:
public class Foo
{
public string FooName { get; set; }
public List<Bar> Items;
}