【问题标题】:Usercontrol contains a combobox, but the Items set at design time are not in the run time用户控件包含一个组合框,但在设计时设置的项目不在运行时
【发布时间】:2014-11-18 21:37:37
【问题描述】:

我有一个包含文本框和组合框的用户控件。我已将组合框的 Item 属性暴露给用户控件的客户端,因此:

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

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

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

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

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

关于为什么项目的设计时间设置没有延续到运行时间的任何想法?

【问题讨论】:

    标签: c# windows combobox custom-controls items


    【解决方案1】:

    你需要一个属性:

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

    【讨论】:

      【解决方案2】:

      也许您还需要定义 setter,例如:

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

      或者,可能是因为您暴露了 Item 但设置了 Items

      【讨论】:

      • 史蒂夫,感谢您的回复。请注意,“项目”是一个错字,属性名称是什么并不重要,只要设置组合框上的正确属性即可。我可以将用户控件的属性命名为“George”,并且只要逻辑返回 baseComboBox.Items,它就可以工作。当然,这可能会使任何必须使用用户控件的程序员感到困惑!大声笑。
      【解决方案3】:

      将 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());
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        相关资源
        最近更新 更多