是否可以在運行時應用EditableAttribute?我只想在用戶有某些角色時纔可以編輯某些屬性。不幸的是EdiatbleAttribute是封閉的。我可以嘗試通過反射在運行時應用它,但也許有更合適的方法來做到這一點。感謝您的任何建議。如何使字段在運行時可編輯
問候
是否可以在運行時應用EditableAttribute?我只想在用戶有某些角色時纔可以編輯某些屬性。不幸的是EdiatbleAttribute是封閉的。我可以嘗試通過反射在運行時應用它,但也許有更合適的方法來做到這一點。感謝您的任何建議。如何使字段在運行時可編輯
問候
有一個黑客請訪問:How to Set Attribute Value at Runtime-- and How to Work around a Silly Bug
private void SetPropertyGrid()
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(typeof(Student))["Address"];
ReadOnlyAttribute attrib = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo isReadOnly = attrib.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
isReadOnly.SetValue(attrib,true);
propertyGrid1.SelectedObject = new Student();
}
我能將此代碼更改屬性的ReadOnly
屬性值。語句propertyGrid1.SelectedObject = new Student();
可以被propertyGrid1.SelectedObject = myStudent
替代,即您可以修改現有對象的屬性。
而且,有一個看一個類似的問題:Change Attribute's parameter at runtime
我認爲一個好的選擇是創建您需要使用控制的擴展幫助(文本框等),如果IsReadOnly屬性爲真(編輯(FALSE)),然後生成一個禁用的文本框。
當然,我可以這樣做,但我更喜歡更通用的解決方案。 – krlm 2011-05-27 08:33:34
注意:您無法通過反射更改屬性。你可以使用'System.ComponentModel'來完成這個工作,但是隻有當調用者通過System.ComponentModel調用*的時候纔會這樣。不幸的是*在屬性級別*(而不是類型級別)很難做到這一點,我認爲它不可能在這種情況下實現任何東西(我懷疑調用者是通過反射來查詢的) – 2011-05-27 08:24:36