【问题标题】:How to set DefaultValueAttribute on List<Color> collection property (set default colors)?如何在 List<Color> 集合属性上设置 DefaultValueAttribute(设置默认颜色)?
【发布时间】:2013-12-02 13:21:52
【问题描述】:

所以我为我的自定义控件声明了 List 集合属性,当我尝试设置 DefaultValueAttribute 时,它​​没有编译错误:

属性参数必须是属性参数的常量表达式、typeof表达式或数组创建表达式 输入

.. 我/我做错了什么?

    private List<Color> _gradientColorList = new List<Color>();
    [CategoryAttribute("Appearance")]
    [DefaultValueAttribute(new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }))]
    public List<Color> GradientColorList
    {
        get
        {
            return _gradientColorList;
        }
        set
        {
            try
            {
                if (value == null)
                    throw new ArgumentNullException();
                if (value == null || value.Count < 2)
                    throw new Exception("Gradient color list count is less than 2.");
                _gradientColorList = value;
                CreateGradientList(GradientColorList);
                Invalidate();
            }
            catch (Exception exc)
            {
                ExcMessageBox(exc);
            }
        }
    }

还有一个问题,当我在 Visual Studio 属性编辑器(颜色集合编辑器)中从 GradientColorList 集合属性中添加或删除颜色时,包含 try-catch 的 set 块不起作用,我不不知道为什么?如何解决?

【问题讨论】:

  • 你能做的最糟糕的事情是在属性设置器中捕获异常以显示消息框。

标签: c# winforms list properties default-value


【解决方案1】:

您可以将 gradientColorList 分配为,而不是使用 DefaultValueAttribute

private List<Color> _gradientColorList = new List<Color>(new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }));

对于第二部分,无论何时添加或删除列表中的实体,都不会调用 setter。仅当您将值分配给“GradientColorList”时才会调用它。如果您将此绑定到 UI,最好使用 ObserverableCollection,它会在添加或删除实体时在内部触发集合更改事件。

【讨论】:

    【解决方案2】:

    正如编译器告诉你的那样: 您不能创建使用 List&lt;&gt; 作为属性的参数。 您提供给属性的所有参数都必须是常量。这意味着它们不应该是可变的。虽然数组符合此条件,但您可以在其中动态添加/删除项目的动态列表不符合此条件。 尝试用列表创建常量,它不起作用:

    const List<Color> COLORS = new List<Color>();
    

    如果您想提供默认值,我认为您有以下 3 个选项:

    • _gradientColorList设置为默认值:

      private _gradientColorList = new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }));
      
    • 将您的 get-function 更改为以下内容:

      if (_gradientColorList == null)
      {
          return new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }));
      }    
      return _gradientColorList;
      
    • 使用数组代替列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-08
      • 2020-06-08
      • 1970-01-01
      • 2016-01-16
      • 2016-05-24
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多