更新:これは解決されました。以下の回答を参照してください。
(Windowsフォームアプリケーションの)フォームの1つに、3つのコンボボックスがあります。これらのコンボボックスは、価格のリストを表示する必要があります(テキストで、整数のバックエンド値)。
これらのコンボボックスはすべて同じデータソース(ValueMemberがPriceに設定され、DisplayMemberがDescriptionに設定されたTSPriceタイプのList <>)を使用しています。
私の問題はこれです...ドロップダウンの1つから価格オプションを選択するたびに、すべて同じ値に変更されます...これは、すべて同じデータソースにバインドされていることと関係がありますか?
ここに私がそれらをバインドする方法があります:
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;
編集:問題は、それらすべてが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;
私はあなたがそれを求めなかったのを知っていますが、あなたの最終的なコードを少しリファクタリングすることをお勧めします:-)
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());
おそらく、このソリューションを試すこともできます。新しいコンテキストを2番目のコンボボックスに割り当てるだけです。
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";
ありがとうございました
なぜこれがそんなに難しいのかわかりません...同じデータソースのクローンにリンクするだけで問題を解決できます。あなたがする必要があるのは
objInsuredPrice.DataSource = new List<TSPrice>(priceList);
objTPPrice.DataSource = new List<TSPrice>(priceList);
objProvSum.DataSource = new List<TSPrice>(priceList);
ちなみに、これはまさにVVSのコードが行うことです。
それでも、奇妙な動作...それはバグですhasだけです、imo。
はい、同じソースにバインドしているので、間違いなく正しいです。1つを選択すると、comboxの残りの部分に適用されます
この問題を解決するには、slectedindex changedイベントで他のコンボボックスハンドラーを手動で削除し、選択したインデックスを設定してから、ハンドラーを追加してコードに挿入する必要があります。以下を参照してください。
ComboBox c1 = new ComboBox();
ComboBox c2 = new ComboBox();
c1.SelectedIndexChanged += new EventHandler(c1_SelectedIndexChanged);
c2.SelectedIndexChanged += new EventHandler(c2_SelectedIndexChanged);
void c2_SelectedIndexChanged(object sender, EventArgs e)
{
c1.SelectedIndexChanged -= c1_SelectedIndexChanged;
c2.SelectedIndex = 2;
c1.SelectedIndexChanged += c1_SelectedIndexChanged;
}
void c1_SelectedIndexChanged(object sender, EventArgs e)
{
c2.SelectedIndexChanged -= c2_SelectedIndexChanged;
c1.SelectedIndex = 2;
c2.SelectedIndexChanged += c2_SelectedIndexChanged;
}
Beth Massiがこの問題と正しい解決策を説明する記事を書きました https://web.archive.org/web/20190114100843/https://blogs.msdn.Microsoft.com/bethmassi/2007/09/ 19/binding-multiple-combo-boxes-to-the-same-data-source /
彼女はまた、彼女がリンクしているDatabindingに関する他の一連のビデオを持っています。
以前の回答を読んだところ、残念ながら、試してもうまくいかなかったことがわかります。
コンボボックスで新しいBindingContextを作成すると、壊れるように見えます。 Bethが説明しているように、完全に新しいBindingSourceセットアップを作成することをお勧めします。
これは私にとってはうまくいき、ソースをコピーする必要はありません。
List<string> days = GetDays();
List<string> months = GetMonths();
List<string> years = GetYears();
Son1DDLDay.DataSource = days;
Son1DDLDay.DataBind();
Son1DDLMonth.DataSource = months;
Son1DDLMonth.DataBind();
Son1DDLYear.DataSource = years;
Son1DDLYear.DataBind();
Son2DDLDay.DataSource = days;
Son2DDLDay.DataBind();
Son2DDLMonth.DataSource = months;
Son2DDLMonth.DataBind();
Son2DDLYear.DataSource = years;
Son2DDLYear.DataBind();