Dar*_*opp 51 c# data-binding winforms
假设您正在执行以下操作
List<string> myitems = new List<string>
{
"Item 1",
"Item 2",
"Item 3"
};
ComboBox box = new ComboBox();
box.DataSource = myitems;
ComboBox box2 = new ComboBox();
box2.DataSource = myitems
Run Code Online (Sandbox Code Playgroud)
所以现在我们有两个绑定到该数组的组合框,一切正常.但是当您更改一个组合框的值时,它会将两个组合框更改为您刚刚选择的组合框.
现在,我知道Arrays总是通过引用传递(了解到当我学习C:D时),但为什么地球上的组合框会一起变化?我不相信组合框控件正在修改集合.
作为一种解决方法,请不要实现预期/期望的功能
ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Run Code Online (Sandbox Code Playgroud)
Rob*_*und 38
这与在dotnet框架中如何设置数据绑定有关,尤其是BindingContext.在较高的层面上,这意味着如果您没有另外指定每个表单和表单的所有控件共享相同BindingContext.当您设置DataSource属性时,ComboBox将使用它BindingContext来获取ConcurrenyMangager包装列表.在ConcurrenyManager跟踪这样的事情在列表中的当前选择的位置.
当您设置DataSource第二个时ComboBox,它将使用相同的BindingContext(表单),这将产生与ConcurrencyManager上面用于设置数据绑定相同的引用.
要获得更详细的说明,请参阅BindingContext.
Qui*_*ome 21
更好的解决方法(取决于数据源的大小)是声明两个BindingSource对象(从2.00开始的新对象)将集合绑定到那些对象,然后将它们绑定到组合框.
我附上一个完整的例子.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private BindingSource source1 = new BindingSource();
private BindingSource source2 = new BindingSource();
public Form1()
{
InitializeComponent();
Load += new EventHandler(Form1Load);
}
void Form1Load(object sender, EventArgs e)
{
List<string> myitems = new List<string>
{
"Item 1",
"Item 2",
"Item 3"
};
ComboBox box = new ComboBox();
box.Bounds = new Rectangle(10, 10, 100, 50);
source1.DataSource = myitems;
box.DataSource = source1;
ComboBox box2 = new ComboBox();
box2.Bounds = new Rectangle(10, 80, 100, 50);
source2.DataSource = myitems;
box2.DataSource = source2;
Controls.Add(box);
Controls.Add(box2);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想让自己更加困惑,那么试着总是在构造函数中声明绑定.这可能会导致一些非常奇怪的错误,因此我总是在Load事件中绑定.
| 归档时间: |
|
| 查看次数: |
19536 次 |
| 最近记录: |