具有相同项的多个ComboBoxEdit控件

本文关键字:ComboBoxEdit 控件 | 更新日期: 2023-09-27 18:13:11

我正在研究一个包含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属性是只读的,所以我不能这样做。

我如何确保我的用户控件的每个实例都有相同的一组选项,即使这些被改变了?让静态成员在用户更改选项列表时触发一个事件可能会达到这个目的,但是对于看起来如此简单的事情来说,这似乎有点过头了。还有人有其他的想法吗?

具有相同项的多个ComboBoxEdit控件

在您的情况下,最好使用LookUpEdit控件而不是ComboBoxEdit。只要对它做一些调整:

lookUpEdit1.Properties.ShowHeader = false;

你可以这样使用你的listItems:

lookUpEdit1.Properties.DataSource = listItems;

Dictionary作为DataSource存在一些问题。对于DataSource,必须使用实现IList, ITypedListIBindingList接口的集合。因此,你可以将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更好。

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

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

如果是我,而不是有静态的东西在控制类,我会使主列表容器一个单独的类,并有一个属性的控制,采取该类的一个实例。这将使您的整体架构更加灵活和可测试。