【问题标题】:C# databound ComboBox changing data in other controlsC# 数据绑定 ComboBox 在其他控件中更改数据
【发布时间】:2014-12-20 13:15:37
【问题描述】:

我有一个非常复杂的问题,所以我会尽力解释:

我有一个 C# Windows Forms (.NET 4) 程序。我的 Windows 窗体包含一个大的空白面板。
在这个程序中,我有一个带有设计器的 Windows 窗体 UserControl 类。用户控件是一个带有两个 ComboBox 和一个 TextBox 的框(称为菜单选项)。

用户控件上的每个 ComboBox 都使用以下方法绑定到不同的 DataSource:

comboBoxSelection1.DataSource = SelectionList1;
comboBoxSelection2.DataSource = SelectionList2;

当用户使用组合框选择项目时,文本框会显示他们的选择。
例如。选择 1:牛排,选择 2:薯条。

这个程序的重点是允许用户创建多个用户控件(菜单选项),每个控件都有不同的选择,从而产生一个选择列表(变成一个单一的顺序)。

到目前为止和我在一起?
在我开始为 ComboBoxes 使用 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 vs SelectedValue

但是当我尝试这段代码时,我的 ComboBox 项目列表仍然是空的:

BindingSource comboBoxSelection1Binding = new BindingSource();
comboBoxSelection1.DataSource = SelectionList1;
comboBoxRuleCustomerGroup.DataBindings.Add("SelectedValue", comboBoxSelection1, "Name", true, DataSourceUpdateMode.OnPropertyChanged);

有什么想法吗?
抱歉,问题过于复杂,我一直不得不编写过于复杂的程序!

【问题讨论】:

    标签: c# .net winforms combobox datasource


    【解决方案1】:

    如果你想完全避免使用数据源

    您可以将项目添加为类而不是 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;
            }
        }
    

    然后,当您需要访问权限时,您会这样做。

    (ComboBox1.SelectedItem as MyClass).Id
    

    【讨论】:

      【解决方案2】:

      在周末深入思考后进行了更详细的搜索。我之前搜索的问题是不知道到底发生了什么。我现在意识到,当尝试将多个组合框绑定到同一个数据集时,这是一个问题。

      终于找到了: Multiple ComboBox controls from the same Dataset

      答案是添加一行:

      comboBoxSelection1.BindingContext = new BindingContext();
      

      所有功劳归功于 Blind Fury/John Saunders 和 Bytes.com。

      【讨论】:

        【解决方案3】:

        您可以尝试将以 object[] 开头的代码 sn-p 重构为它自己的方法,传入 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 并唯一地填充它们。

        【讨论】:

        • 感谢您的想法,但是我不得不切换到数据绑定而不是单独将描述添加到组合框中的原因是某些描述相同但具有不同的 ID。不幸的是,这是一个完全不受我控制的列表,并且这些重复的名称是不可避免的(我仅使用食物菜单作为示例,我的工作数据集要复杂得多)组合框中选择的描述需要绑定到所选项目的唯一 ID。不幸的是,这就是我真正需要使用数据绑定的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多