[英]C# databound ComboBox changing data in other controls
我再次有一個非常復雜的問題,所以我會盡力解釋:
我有一個 C# Windows 窗體 (.NET 4) 程序。 我的 Windows 窗體包含一個大的空白面板。
在這個程序中,我有一個帶有設計器的 Windows 窗體 UserControl 類。 用戶控件是一個帶有兩個 ComboBox 和一個 TextBox 的框(稱之為菜單選項)。
用戶控件上的每個 ComboBox 都使用以下方法綁定到不同的數據源:
comboBoxSelection1.DataSource = SelectionList1;
comboBoxSelection2.DataSource = SelectionList2;
當用戶使用 ComboBoxes 選擇一個項目時,TextBox 會顯示他們的選擇。
例如,選擇 1:牛排,選擇 2:薯條。
該程序的全部意義在於允許用戶創建多個用戶控件(菜單選擇),每個控件都有不同的選擇,從而產生一個選擇列表(成為一個單一的訂單)。
陪我到此為止?
在我開始為 ComboBox 使用 DataSource 之前,這非常有效,如下所示:
object[] comboBoxList1 = new object[SelectionList1.Count];
int i = 0;
foreach (Selection s in SelectionList1)
{
string description = s.Description;
comboBoxList1[i] = description;
i++;
}
comboBoxSelection1.Items.AddRange(comboBoxList1);
但是,我需要使用 DataSource 來按 id 區分項目(某些顯示的名稱是相同的 - 我無法更改)。
我現在正在使用以下內容:
comboBoxSelection1.DataSource = SelectionList1;
comboBoxSelection1.ValueMember = "Code";
comboBoxSelection1.DisplayMember = "Name";
問題是,每當我在我的一個用戶控件上更改 comboBoxSelection1 時,面板上每個用戶控件上的 comboBoxSelection1 值都會更改為我的當前選擇。 如果我更改任何 comboBoxSelection2 中的值,comboBoxSelection2 也會發生同樣的情況,所有 comboBoxSelection2 框都會更改為相同的值。
這是將一個數據源用於多個控件的錯誤嗎?
它已經在這里看到: Data Bound ComboBox: List item changed when I select another
在這種情況下,問題是通過使用 DataBindings 而不是 DataSource 解決的。
如下所示: ComboBox SelectedItem 與 SelectedValue 。
但是當我嘗試這段代碼時,我的 ComboBox 項目列表仍然是空的:
BindingSource comboBoxSelection1Binding = new BindingSource();
comboBoxSelection1.DataSource = SelectionList1;
comboBoxRuleCustomerGroup.DataBindings.Add("SelectedValue", comboBoxSelection1, "Name", true, DataSourceUpdateMode.OnPropertyChanged);
有任何想法嗎?
對於過於復雜的問題很抱歉,我一直不得不編寫過於復雜的程序!
在周末深入思考后做了更詳細的搜索。 我之前搜索的問題是不知道真正發生了什么。 我現在意識到,當嘗試將多個組合框綁定到同一個數據集時,這是一個問題。
終於找到了: 來自同一數據集的多個 ComboBox 控件
答案是添加以下行:
comboBoxSelection1.BindingContext = new BindingContext();
所有功勞歸功於 Blind Fury/John Saunders 和 Bytes.com。
您可以嘗試將以 object[] 開頭的代碼片段重構為傳入 ComboBox 控件和 SelectionList 的自己的方法。
private void PopulateList(ComboBox boxToPopulate, List<String> selectionList)
{
object[] comboBoxList1 = new object[selectionList.Count];
int i = 0;
foreach (Selection s in selectionList)
{
string description = s.Description;
comboBoxList1[i] = description;
i++;
}
boxToPopulate.Items.AddRange(comboBoxList1);
}
使用這種方法,您可以擁有無限數量的 ComboBox 並唯一地填充它們。
如果你想完全避免使用數據源
您可以將項目添加為類而不是 fx
ComboBox1.Items.Add(new MyClass("Name", 1))
然后上課
public class MyClass
{
private readonly string _Navn;
public MyClass(string name, Int id)
{
Id = id;
Name = name;
}
public int Id{ get; }
public override string ToString()
{
return Name;
}
}
然后,當您需要訪問 id 時,您可以這樣做。
(ComboBox1.SelectedItem as MyClass).Id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.