我有一个包含文本框和组合框的用户控件。我已经向用户控件的客户端公开了组合框的 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());
}
}