多个ComboBoxEdit控件具有相同的项目

时间:2014-07-16 19:12:04

标签: c# winforms combobox static devexpress

我正在处理一个包含SpinEdit(数字上下)控件和ComboBoxEdit的用户控件。在组合框中选择的选项提供了一个乘以SpinEdit中的数字的因子。目前,我有这样的事情:

public class MyUserControl : DevExpress.XtraEditors.XtraUserControl 
{
    private static List<String> listItems;
    static MyUserControl() // Populate the list of options with the default options
    {
        listItems = new List<String?();
        listItems.Add("Option1");
        listItems.Add("Option2");
        listItems.Add("Option3");
    }

    public MyUserControl()
    {
        InitializeComponent();

        // Add default options to the combo box
        foreach (String item in listItems)
        {
            this.cboBox.Properties.Items.Add(item);
        }
    }
}

工作正常(注意上面的内容是简化的,实际上静态列表是一个静态字典,它将字符串映射到乘法因子),除了我想允许用户向listItems添加自定义选项并在我的应用程序中显示这个用户控件的每个实例。这就是为什么listItems是静态的,因为我的希望是this.cboBox.Properties.Items = listItems;,以便listItems的任何添加都出现在每个控件上。但是,Items属性是只读的,所以我不能这样做。

如何确保我的用户控件的每个实例都具有相同的选项集,即使这些选项已更改?让静态成员在用户更改选项列表时触发事件可能会有所帮助,但对于看起来像这样简单的事情来说,这似乎有些过分。有没有人有其他想法?

2 个答案:

答案 0 :(得分:0)

我不知道DevExpress控件(您可能想在他们的支持论坛上询问),但在经典的Windows组合框中,列表保留在控件内。 Items属性是一个.Net包装器,使内部结构更易于使用。因此,不可能为每个组合框分配相同的数据结构。他们有自己的副本。

您对现在的静态列表具有发布/订阅机制的想法似乎是一种合理的解决方案。

如果是我,而不是在控件类上使用静态内容,我将使主列表容器成为一个单独的类,并在控件上有一个属性,该属性接受该类的实例。它使您的整体架构更加灵活和可测试。

答案 1 :(得分:0)

在您的情况下,最好使用LookUpEdit控制而不是ComboBoxEdit。只需对其进行一些调整:

lookUpEdit1.Properties.ShowHeader = false;

您可以这样使用listItems

lookUpEdit1.Properties.DataSource = listItems;

Dictionary DataSource存在问题。对于DataSource,您必须使用实现IListITypedListIBindingList接口的集合。因此,您可以将Dictionary转换为List,也可以使用此技巧:

private static Dictionary<int, string> items;

//...

lookUpEdit1.QueryPopUp += lookUpEdit_QueryPopUp;
lookUpEdit2.QueryPopUp += lookUpEdit_QueryPopUp;

//...

private void lookUpEdit_QueryPopUp(object sender, CancelEventArgs e)
{
    var lookUpEdit = (LookUpEdit)sender;

    lookUpEdit.Properties.DataSource = null;
    lookUpEdit.Properties.DataSource = items;
}

但我认为最好使用List代替Dictionary