2013-10-28 208 views
4

我有一個PropertyGrid,我用它在助手類中顯示屬性。我給你的助手類的PropertyGrid這樣的:在PropertyGrid中動態設置屬性的只讀屬性

myPropertyGrid.SelectedObject = mySettingsHelper; 

在輔助類我分配ReadOnlyAttribute在設計時是這樣的:

[DisplayName("DisplayExA"), 
Description("DescriptionExA"), 
ReadOnlyAttribute(true)] 
public string PropertyA { get; set; } 

[DisplayName("DisplayExB"), 
Description("DescriptionExB"), 
ReadOnlyAttribute(false)] 
public string PropertyB { get; set; } 

[DisplayName("DisplayExC"), 
Description("DescriptionExC"), 
ReadOnlyAttribute(true)] 
public string PropertyC { get; set; } 

但現在我需要能夠改變這一屬性在運行時動態地顯示各個屬性。根據某些標準,這些屬性中的某些屬性可能需要是隻讀的或不是隻讀的。我如何在運行時動態地進行更改?

編輯:

我試着下面的代碼,但這個設置只讀屬性爲對象的每個實例!我想按照每個對象來做。有時一個對象可能具有PropertyA只讀,而另一個對象具有PropertyA而不是隻讀。

public static class PropertyReadOnlyHelper 
{ 
    public static void SetReadOnly(object container, string name, bool value) 
    { 
     try 
     { 
      PropertyDescriptor descriptor = TypeDescriptor.GetProperties(container.GetType())[name]; 
      ReadOnlyAttribute attribute = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)]; 
      FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly", 
               System.Reflection.BindingFlags.NonPublic | 
               System.Reflection.BindingFlags.Instance); 
      fieldToChange.SetValue(attribute, value); 
     } 
     catch { } 
    } 
} 
+0

PropertyGrid'多少'你在你的應用程序中使用?如果一次只使用1個'PropertyGrid',我認爲你的目的可以實現,我們仍然需要改變'Attribute'類型,但是在選擇一個對象之前,我們將相應地切換'ReadOnly',並且應該這樣做招。 –

回答

1

我能夠使用此文章中的庫完成我所需要的操作(只讀屬性的對象級別分配)。好的是,它使我仍然可以使用.NET PropertyGrid,並只使用自定義屬性來處理動態設置。

+1

無法鏈接到CodeProject文章。 – Crackerjack

0

使用反射來獲得ReadOnlyAttribute類的實例的引用,然後切換該實例上IsReadOnly屬性。最後,如果需要將PropertyObjects的SelectedObjects設置爲null,然後重置它,則重新選擇PropertyGrid中的項目。您也許可以使用PropertyGrid RefreshTabs方法來做到這一點,我不確定。

編輯:

不幸的是,IsReadOnly屬性本身是隻讀......在這種情況下,我們不得不使用反射來改變支持字段的值IsReadOnly屬性。

0

添加只讀

enter code here 
TextBoxID.Attributes.Add("readonly","true"); 

刪除只讀

enter code here 
TextBoxID.Attributes.Remove("readonly");