PropertyGrid: как скрыть свойства базового класса? - PullRequest
7 голосов
/ 14 августа 2011

PropertyGrid ... для пользователей Мне бы хотелось оставить только несколько из них. Но теперь я вижу все, и пользователи будут смущены, когда увидят что-то вроде Dock или Cursor и тому подобное ... Надеюсь, сейчас все ясно ...

Ответы [ 2 ]

11 голосов
/ 14 августа 2011

Используйте этот атрибут:

[Browsable(false)]
public bool AProperty {...} 

Для унаследованных свойств:

[Browsable(false)]
public override bool AProperty {...} 

Другая идея (поскольку вы пытаетесь скрыть всех членов базового класса):

public class MyCtrl : TextBox
{
  private ExtraProperties _extraProps = new ExtraProperties();

  public ExtraProperties ExtraProperties
  {
    get { return _extraProps; }
    set { _extraProps = value; }
  }
}

public class ExtraProperties
{
  private string _PropertyA = string.Empty;

  [Category("Text Properties"), Description("Value for Property A")]
  public string PropertyA {get; set;}

  [Category("Text Properties"), Description("Value for Property B")]
  public string PropertyB { get; set; }
}

, а затем для вашей сетки свойств:

  MyCtrl tx = new MyCtrl();
  pg1.SelectedObject = tx.ExtraProperties;

Недостатком является изменение уровня доступа к этим свойствам с

tx.PropertyA = "foo";

на

tx.ExtraProperties.PropertyA = "foo";
8 голосов
/ 14 августа 2011

Чтобы скрыть MyCtrl свойства, используйте атрибут [Browsable(False)] для свойства.

[Browsable(false)]
public bool AProperty { get; set;}

Чтобы скрыть унаследованные свойства, необходимо переопределитьдобавьте и примените атрибут browsable.

[Browsable(false)]
public override string InheritedProperty  { get; set;}

Примечание: В зависимости от обстоятельств может потребоваться добавить ключевое слово virtual или new.

Лучше было бы использовать ControlDesigner.В конструкторе есть переопределение под названием PreFilterProperties, которое можно использовать для добавления дополнительных атрибутов в коллекцию, извлеченную с помощью PropertyGrid.

Designer(typeof(MyControlDesigner))]
public class MyControl : TextBox
{
    // ...
}

public class MyControlDesigner : ...
{
    // ...

    protected override void PreFilterProperties(
                             IDictionary properties) 
    {
        base.PreFilterProperties (properties);

        // add the names of proeprties you wish to hide
        string[] propertiesToHide = 
                     {"MyProperty", "ErrorMessage"};  

        foreach(string propname in propertiesToHide)
        {
            prop = 
              (PropertyDescriptor)properties[propname];
            if(prop!=null)
            {
                AttributeCollection runtimeAttributes = 
                                           prop.Attributes;
                // make a copy of the original attributes 

                // but make room for one extra attribute

                Attribute[] attrs = 
                   new Attribute[runtimeAttributes.Count + 1];
                runtimeAttributes.CopyTo(attrs, 0);
                attrs[runtimeAttributes.Count] = 
                                new BrowsableAttribute(false);
                prop = 
                 TypeDescriptor.CreateProperty(this.GetType(), 
                             propname, prop.PropertyType,attrs);
                properties[propname] = prop;
            }            
        }
    }
}

. Вы можете добавить имена объектов, которые хотите скрыть.до propertiesToHide, что обеспечивает более чистое разделение.

Кредит в срок: http://www.codeproject.com/KB/webforms/HidingProperties.aspx#

...