Tom*_*enn 28 c# combobox datasource winforms
更新:现在已解决,请参阅下面的答案.
在我的一个表单(在Windows窗体应用程序中)我有3个组合框.这些组合框需要显示价格列表(在文本中,带有整数后端值).
所有这些组合框都使用相同的数据源(TSPrice类型的A List <>,ValueMember设置为Price,DisplayMember设置为Description).
我的问题是这样的...每当我从其中一个下拉列表中选择一个价格选项时,它们都会更改为相同的值...这是与它们绑定到同一数据源有关吗?
这是我如何约束他们:
var priceList = new List<TSPrice>
{
new TSPrice(0, ""),
new TSPrice(0, "Half Day"),
new TSPrice(0, "Full Day"),
new TSPrice(0, "1 + Half"),
new TSPrice(0, "2 Days"),
new TSPrice(0, "Formal Quote Required")
};
objInsuredPrice.DataSource = priceList;
objTPPrice.DataSource = priceList;
objProvSum.DataSource = priceList;
objInsuredPrice.ValueMember = "Price";
objTPPrice.ValueMember = "Price";
objProvSum.ValueMember = "Price";
objInsuredPrice.DisplayMember = "Description";
objTPPrice.DisplayMember = "Description";
objProvSum.DisplayMember = "Description";
objInsuredPrice.SelectedIndex = 0;
objTPPrice.SelectedIndex = 0;
objProvSum.SelectedIndex = 0;
//objInsuredPrice.DataSource = objTPPrice.DataSource = objProvSum.DataSource = priceList;
//objInsuredPrice.ValueMember = objTPPrice.ValueMember = objProvSum.ValueMember = "Price";
//objInsuredPrice.DisplayMember = objTPPrice.DisplayMember = objProvSum.DisplayMember = "Description";
//objInsuredPrice.SelectedIndex = objTPPrice.SelectedIndex = objProvSum.SelectedIndex = 0;
Run Code Online (Sandbox Code Playgroud)
编辑:问题是他们都被Saurabh确认的绑定到相同的DataSource.这就是我解决它的方式.
var priceList = new List<TSPrice>
{
new TSPrice(0, ""),
new TSPrice(1, "Half Day"),
new TSPrice(2, "Full Day"),
new TSPrice(3, "1 + Half"),
new TSPrice(4, "2 Days"),
new TSPrice(5, "Formal Quote Required")
};
var insuredList = new TSPrice[5];
var TPList = new TSPrice[5];
var provList = new TSPrice[5];
priceList.CopyTo(insuredList);
priceList.CopyTo(TPList);
priceList.CopyTo(provList);
objInsuredPrice.DataSource = insuredList;
objTPPrice.DataSource = TPList;
objProvSum.DataSource = provList;
objInsuredPrice.ValueMember = objTPPrice.ValueMember = objProvSum.ValueMember = "Price";
objInsuredPrice.DisplayMember = objTPPrice.DisplayMember = objProvSum.DisplayMember = "Description";
objInsuredPrice.SelectedIndex = objTPPrice.SelectedIndex = objProvSum.SelectedIndex = 0;
Run Code Online (Sandbox Code Playgroud)
IMR*_*IMR 64
可能你也可以尝试这个解决方案,只需为第二个组合框分配一个新的Context:
combobox1.DataSource = results;
combobox1.DisplayMember = "DisplayValue";
combobox1.ValueMember = "Value";
combobox2.BindingContext = new BindingContext(); //create a new context
combobox2.DataSource = results;
combobox2.DisplayMember = "DisplayValue";
combobox2.ValueMember = "Value";
Run Code Online (Sandbox Code Playgroud)
谢谢
Nye*_*uds 13
我不明白为什么这应该这么难......你可以将它们链接到相同数据源的克隆......这可以解决问题.你需要做的就是
objInsuredPrice.DataSource = new List<TSPrice>(priceList);
objTPPrice.DataSource = new List<TSPrice>(priceList);
objProvSum.DataSource = new List<TSPrice>(priceList);
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这正是VVS的代码所做的.
仍然,奇怪的行为......只是必须是一个bug,imo.
我知道你没有要求它,但我可以建议你稍微重构一下你的最终代码:-)
private List<TSPrice> GetPriceList()
{
return new List<TSPrice>
{
new TSPrice(0, ""),
new TSPrice(0, "Half Day"),
new TSPrice(0, "Full Day"),
new TSPrice(0, "1 + Half"),
new TSPrice(0, "2 Days"),
new TSPrice(0, "Formal Quote Required")
};
}
private void BindPriceList(ComboBox comboBox, List<TSPrice> priceList)
{
comboBox.DataSource = priceList();
comboBox.ValueMember = "Price";
comboBox.DisplayMember = "Description";
comboBox.SelectedIndex = 0;
}
BindPriceList(objInsuredPrice, GetPriceList());
BindPriceList(objTPPrice, GetPriceList());
BindPriceList(objProvSum, GetPriceList());
Run Code Online (Sandbox Code Playgroud)