我正在编写一个程序,它根据数据库值在表单上生成许多自定义控件。该程序的一部分是将数据库中的唯一ID存储在自定义属性中。我使用它来访问和更改控件是否启用(基于验证)。我可以为属性赋值并从类中检索它们,但是当我尝试在不同的类中访问它时,我只是获取默认值。
属性类:
public class DCAttr : Attribute
{
int _ControlID;
ValidationType _ValidationType;
public DCAttr()
{
_ControlID = 0; //Base value
_ValidationType = ValidationType.NONE;
}
public int ControlID
{
get
{
return _ControlID;
}
set
{
_ControlID = value;
}
}
public ValidationType ValidationType
{
get
{
return _ValidationType;
}
set
{
_ValidationType = value;
}
}
}
根据属性中存储的ID启用控件的功能:
public static void enablecontrolbyID(int ID)
{
DataCapture2 form = (DataCapture2)Application.OpenForms[0]; //Thank the lord for 1 page applications :D
foreach (Control cont in form.Controls)
{
DCAttr dcattr = (DCAttr)Attribute.GetCustomAttributes(cont.GetType())[0];
if (dcattr.ControlID == ID)
{
cont.Enabled = true;
break;
}
}
}
在上面指定的访问中,对于ValidationType,控制ID和ValidationType.None的返回值为0,但这些值在内部已经明确更改(使用断点进行确认,内部函数也在使用它并且工作正常)。
有什么想法吗?
编辑:为了清楚地在内部更新属性。 我使用属性附加到的类中的私有值来访问它们:
private DCAttr dcattr = (DCAttr)Attribute.GetCustomAttributes(typeof(DCGroupBoxRadio))[0]; // Reference to access Control ID
在初始化函数中,我有以下代码:
public DCGroupBoxRadio(int ID)
{dcattr.ControlID = ID}
答案 0 :(得分:0)
属性成员在编译时计算,不能在运行时更改。我想这是你想问的问题的答案。
EDIT1:
您可以更改属性成员,但是当您获取属性的新实例时,这些更改将不会保留,即使它来自相同的属性类型或装饰实例..这再次将我们带到上面提供的答案编辑。