2011-05-27 60 views
2

是否可以在運行時應用EditableAttribute?我只想在用戶有某些角色時纔可以編輯某些屬性。不幸的是EdiatbleAttribute是封閉的。我可以嘗試通過反射在運行時應用它,但也許有更合適的方法來做到這一點。感謝您的任何建議。如何使字段在運行時可編輯

問候

+1

注意:您無法通過反射更改屬性。你可以使用'System.ComponentModel'來完成這個工作,但是隻有當調用者通過System.ComponentModel調用*的時候纔會這樣。不幸的是*在屬性級別*(而不是類型級別)很難做到這一點,我認爲它不可能在這種情況下實現任何東西(我懷疑調用者是通過反射來查詢的) – 2011-05-27 08:24:36

回答

1

有一個黑客請訪問: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

0

我認爲一個好的選擇是創建您需要使用控制的擴展幫助(文本框等),如果IsReadOnly屬性爲真(編輯(FALSE)),然後生成一個禁用的文本框。

+0

當然,我可以這樣做,但我更喜歡更通用的解決方案。 – krlm 2011-05-27 08:33:34