List<string> 属性 用于在 UserControl 中填充 ComboBox - C#

List<string> Property for populating a ComboBox inside a UserControl - C#

我有一个 UserControl,里面有一个 ComboBox。我需要使用列表 属性 填充 ComboBox 项目,但我在设计器中收到以下错误:

constructor on type 'system.string' not found

这是我的代码:

public List<string> comboItems
{
    get
    {
        List<string> n = new List<string>();
        foreach (var i in comboBox1.Items)
            n.Add(i.ToString());
        return n;
    }
    set
    {
        if (comboItems == null)
            comboItems = new List<string>();
        foreach (var i in value)
            comboBox1.Items.Add(i);
    }
}

一般来说,将 ComboBox 的项目公开为 string[]List<string> 不是一个好主意,因为用户可能会设置 ComboItems[0] = "something" 但它不会更改组合框项目的第一个元素。

但是如果您正在寻找一种解决方案来消除您在设计器中收到的错误消息,请使用 string[] 而不是 List<string> 并将您的代码更改为:

public string[] ComboItems {
    get {
        return comboBox1.Items.Cast<object>()
                .Select(x => x.ToString()).ToArray();
    }
    set {
        comboBox1.Items.Clear();
        comboBox1.Items.AddRange(value);
    }
}

备注

这是在 UserControl 中公开 ComboBoxItems 属性 的正确方法:

[Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, " +
    "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
    typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ComboBox.ObjectCollection ComboItems {
    get { return comboBox1.Items; }
}

您可以为您的 属性 使用 ObjectCollection 并将其直接分配给您的组合框。这样你就可以使用设计编辑器了。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ObjectCollection ComboItems
{
    get
    {
        return comboBox1.Items;
    }
    set
    {
        comboBox1.Items.Clear();
        foreach (var i in value)
            comboBox1.Items.Add(i);
    }
}