簡體   English   中英

C# 數據綁定 ComboBox 更改其他控件中的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM