用户控件的属性值赋值顺序可以自定义吗?

皮特胖胖 2015-06-13 04:51:36
一个用户控件包含有两个属性值A和B,并且是相互关联的,必须先给A赋值,然后给B赋值。
现在在设计器中修改它们的值,先修改A后修改B,正常没问题,然后运行时就报错了,
打开窗体对应的.Designer.cs文件,发现赋值顺序反了。
请问属性值赋值顺序是否可以自定义其顺序?
就是不管在窗体设计器中如何修改,在设计器对应的文件中始终先给A赋值后给B赋值?
...全文
116 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Forty2 2015-06-13
  • 打赏
  • 举报
回复
应该善用ISupportInitialize接口,而不是押宝在设计器的具体行为上。 如果你的组件/控件支持ISupportInitialize,那么设计器就会生成相应的BeginInit和EndInit代码, 你就可以把逻辑放到EndInit中,而不用关心设计器赋值的循序。 比如,一个组件有Max和Min属性,要求Max不能小于Min。 如果直接在属性函数中判断,会依赖于设计器的赋值循序,如果实现ISupportInitialize,则顺序不成问题:
public class MyComponent : Component, ISupportInitialize
{
    public int Max { get; set; } 
    public int Min { get; set; }

    public void BeginInit()
    {
    }

    public void EndInit()
    {
        if (Max < Min) throw new InvalidOperationException("Max must not less then Min");
    }
}
完整一些可以这样写:

public class MyComponent : Component, ISupportInitialize
{
    int max;
    public int Max 
    {
        get { return max; }
        set { ValidateMaxMin(value, min); max = value; }
    }

    int min;
    public int Min 
    {
        get { return min; }
        set { ValidateMaxMin(max, value); min = value; }
    }

    bool initializing;
    void ValidateMaxMin(int max, int min)
    {
        if (max < min && !initializing) throw new InvalidOperationException("Max must not less then Min");
    }

    public void BeginInit()
    {
        initializing = true;
    }

    public void EndInit()
    {
        initializing = false;
        ValidateMaxMin(max, min);
    }
}
xuzuning 2015-06-13
  • 打赏
  • 举报
回复
属性在 Designer.cs 的排列是按属性名在哈希表中的位置进行的 你可以调整命名,使得一个总是排在另一个的前面 否则你就需要在赋值时通过代码来保证约束

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧