用户控件的属性值赋值顺序可以自定义吗?解决方法
用户控件的属性值赋值顺序可以自定义吗?
一个用户控件包含有两个属性值A和B,并且是相互关联的,必须先给A赋值,然后给B赋值。
现在在设计器中修改它们的值,先修改A后修改B,正常没问题,然后运行时就报错了,
打开窗体对应的.Designer.cs文件,发现赋值顺序反了。
请问属性值赋值顺序是否可以自定义其顺序?
就是不管在窗体设计器中如何修改,在设计器对应的文件中始终先给A赋值后给B赋值?
------解决思路----------------------
属性在 Designer.cs 的排列是按属性名在哈希表中的位置进行的
你可以调整命名,使得一个总是排在另一个的前面
否则你就需要在赋值时通过代码来保证约束
------解决思路----------------------
应该善用ISupportInitialize接口,而不是押宝在设计器的具体行为上。
如果你的组件/控件支持ISupportInitialize,那么设计器就会生成相应的BeginInit和EndInit代码,
你就可以把逻辑放到EndInit中,而不用关心设计器赋值的循序。
比如,一个组件有Max和Min属性,要求Max不能小于Min。
如果直接在属性函数中判断,会依赖于设计器的赋值循序,如果实现ISupportInitialize,则顺序不成问题:
完整一些可以这样写:
一个用户控件包含有两个属性值A和B,并且是相互关联的,必须先给A赋值,然后给B赋值。
现在在设计器中修改它们的值,先修改A后修改B,正常没问题,然后运行时就报错了,
打开窗体对应的.Designer.cs文件,发现赋值顺序反了。
请问属性值赋值顺序是否可以自定义其顺序?
就是不管在窗体设计器中如何修改,在设计器对应的文件中始终先给A赋值后给B赋值?
------解决思路----------------------
属性在 Designer.cs 的排列是按属性名在哈希表中的位置进行的
你可以调整命名,使得一个总是排在另一个的前面
否则你就需要在赋值时通过代码来保证约束
------解决思路----------------------
应该善用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);
}
}