用户控件包含一个组合框,但在设计时设置的项不在运行时中



我有一个包含文本框和组合框的用户控件。我已经向用户控件的客户端公开了组合框的 Item 属性,因此:

public System.Windows.Forms.ComboBox.ObjectCollection Item
{
    get { return baseComboBox.Items; }
}

我将用户控件添加到窗口窗体,并使用窗体设计器中的属性值编辑器设置"项"列表。然后我运行了该应用程序,组合框的下拉列表为空。为了确认在设计时添加的项不在列表中,我向客户端窗体添加了以下两行代码:

textBox1.Text = userControl1.Items.Count.ToString();
userControl1.Items.Add("Test item");

当我重新运行应用程序时,测试框显示计数为 0(零),并且用户控件的下拉列表仅包含"测试项"。

考虑到在设计时引用的用户控件的实例可能

与运行时引用的实例不同,我在设计时设置了用户控件的 BackColor 属性。当我重新运行应用时,用户控件的 BackColor 是我在设计器中设置的

关于为什么 Items 的设计时设置不会延续到运行时的任何想法?

你需要一个属性:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ComboBox.ObjectCollection Item {
  get { return baseComboBox.Items; }
}

也许您还需要定义的 setter,如下所示:

public System.Windows.Forms.ComboBox.ObjectCollection Item
{
    get { return baseComboBox.Items; }
    set { baseComboBox.Items = value; }
}

或者,可能是因为您正在公开项目但设置了项目

将 Set 定义为简单的 baseComboBox.Items = value;是不可能的,因为 baseComboBox.Items 被定义为 ReadOnly问题还在于缺乏此类集合的已定义编辑器。

因此,您应该添加编辑器定义,而不是尝试将集合替换为一个对象 - 请使用 AddRange

    [Editor("System.Windows.Forms.Design.StringCollectionEditor, " +
        "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
        typeof(UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ComboBox.ObjectCollection Items
    {
        get
        {
            return baseComboBox.Items;
        }
        set
        {
            baseComboBox.Items.Clear();
            baseComboBox.Items.AddRange(value.Cast<object>().ToArray());
        }
    }

最新更新