2013-06-17 3 views
3

Я бы хотел создать PerformanceCounter на лету, установив свои аргументы с помощью PropertyGrid. Если я установил PropertyGrid.SelectedObject в PerformanceCounter, он не предоставил те же параметры, что и в среде IDE. enter image description hereНастройка PerformanceCounter с PropertyGrid

Как я могу сделать трюк? Это вообще возможно?

+0

Свойство добавлен в окне Свойства специфичны для дизайнера. Как GenerateMember, вы не будете генерировать членов в PropertyGrid. Очень непонятно, почему вы думаете, что это проблема. –

+0

Я не думаю, что это проблема. Я хотел бы архивировать то же самое, что я вижу в дизайнере, и хотел бы знать, как это сделать. – Pho3nixHun

+0

К сожалению, я имел в виду * достижение – Pho3nixHun

ответ

0

В соответствии с этим article есть некоторые параметры, которые нельзя изменить во время выполнения. Это указывает на то, что по умолчанию свойствоgrid будет показывать только те параметры, которые могут быть изменены во время выполнения, и всегда будет разница между настройками, которые вы видите в режиме разработки, и с какими параметрами вы видите во время выполнения.

+0

Я хотел бы изменить 'CatergoryName',' CounterName', 'InstanceName',' MachineName'. Они могут быть изменены во время выполнения. Я только хотел знать, есть ли общее решение (например, класс или структура установки) для настройки 'PerformanceCounter' с' PropertyGrid' – Pho3nixHun

1

Основная проблема - некоторые свойства PerformanceCounter, такие как CategoryName, помечены атрибутом ReadOnly. Когда сетка свойств видит атрибут ReadOnly для свойства, вы не можете его редактировать, поэтому вы можете «вывести список со списком имен категорий».

Я не знаю, как то, что волшебник использует для преодоления этим дизайнером, но вот мое решение. Мы добавляем настраиваемый TypeDescriptionProvider к экземпляру Редактора PerformanceCounter и предоставляем дескриптор пользовательского типа, который удаляет ограничение ReadOnly.

Это, как вы можете использовать его (с экземпляром propertyGrid1 класса PropertyGrid):

PerformanceCounter counter = new PerformanceCounter(); 

// use a custom type description provider for this counter 
TypeDescriptor.AddProvider(new PerformanceCounterTypeProvider(), counter); 

// filter unwanted properties 
propertyGrid1.BrowsableAttributes = new AttributeCollection(DesignerSerializationVisibilityAttribute.Visible); 

// select it in the property grid 
propertyGrid1.SelectedObject = counter; 

И это код утилиты используется:

public class PerformanceCounterTypeProvider : TypeDescriptionProvider 
{ 
    private static PropertyDescriptor[] _properties; 

    static PerformanceCounterTypeProvider() 
    { 
     List < PropertyDescriptor> properties = new List<PropertyDescriptor>(); 
     foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(typeof(PerformanceCounter))) 
     { 
      PerformanceCounterPropertyDescriptor clone = new PerformanceCounterPropertyDescriptor(pd); 
      properties.Add(clone); 
     } 
     _properties = properties.ToArray(); 
    } 

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance) 
    { 
     return new PerformanceCounterTypeDescriptor(); 
    } 

    private class PerformanceCounterTypeDescriptor : CustomTypeDescriptor 
    { 
     public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) 
     { 
      return new PropertyDescriptorCollection(PerformanceCounterTypeProvider._properties.ToArray()); 
     } 
    } 

    private class PerformanceCounterPropertyDescriptor : PropertyDescriptor 
    { 
     private PropertyDescriptor _desc; 

     public PerformanceCounterPropertyDescriptor(PropertyDescriptor desc) 
      : base(desc, new List<Attribute>(desc.Attributes.OfType<Attribute>()).ToArray()) 
     { 
      _desc = desc; 
     } 

     public override void SetValue(object component, object value) 
     { 
      // we can't use _desc.SetValue because the underlying property descriptor checks it's read only 
      ComponentType.GetProperty(Name).SetValue(component, value, null); 
     } 

     public override bool IsReadOnly 
     { 
      get { return false; } 
     } 

     public override bool CanResetValue(object component) 
     { 
      return _desc.CanResetValue(component); 
     } 

     public override Type ComponentType 
     { 
      get { return _desc.ComponentType; } 
     } 

     public override object GetValue(object component) 
     { 
      return _desc.GetValue(component); 
     } 

     public override Type PropertyType 
     { 
      get { return _desc.PropertyType; } 
     } 

     public override void ResetValue(object component) 
     { 
      _desc.ResetValue(component); 
     } 

     public override bool ShouldSerializeValue(object component) 
     { 
      return _desc.ShouldSerializeValue(component); 
     } 
    } 
} 
+0

Спасибо, я проверил его, и процедура 'GetValue' выбрасывает это имя категории , Не могли бы вы проверить его? – Pho3nixHun