2011-08-14 25 views

Odpowiedz

9

Korzystanie z tego atrybutu:

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

Dla odziedziczone właściwości:

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

Innym pomysłem (ponieważ starają się ukryć wszystkich członków klasy bazowej):

a następnie do siatki właściwość:

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

Wadą jest to, że zmienia swój poziom dostępu do tych właściwości z

tx.PropertyA = "foo"; 

do

tx.ExtraProperties.PropertyA = "foo"; 
+0

nie chodzi o klasę dziedziczone, chcę ukryć właściwości klasy bazowej. W takim przypadku: rekwizyty TextBox. Jak ukryć rekwizyty klasy podstawowej? Oto jest pytanie. –

+0

Tak, działa, wiem. Zobaczysz w moim pytaniu stwierdzenie: "Jaka technika ma zastosowanie w tym przypadku? Ukrywanie się?" Każdy rekwizyt klasy bazowej? "... Zastanawiam się, czy mógłbym filtrować atrybuty ... ale wydaje się, że w czasie wykonywania nie jest to możliwe, ponieważ wszystkie atrybuty są statyczne dla skompilowanego zestawu. –

+0

Lars, przeczytaj moją odpowiedź. To było dokładnie to, czego potrzebowałem ... –

6

Aby ukryć MyCtrl właściwości, zastosowanie [Browsable(False)] atrybut na nieruchomości.

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

Aby ukryć dziedziczone proeprties, trzeba zastąpić bazę i zastosować atrybut który możesz przeglądać.

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

Uwaga: może trzeba dodać virtual lub new słowa kluczowego w zależności od okoliczności.

Lepszym rozwiązaniem byłoby użycie ControlDesigner. Projektant ma nadpisanie o nazwie PreFilterProperties, które można wykorzystać do dodania dodatkowych atrybutów do kolekcji wyodrębnionej przez 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; 
      }    
     } 
    } 
} 

Możesz dodać nazwiska proeprties chcesz ukryć do propertiesToHide który pozwala na czystsze separacji.

kredytowych, gdzie z powodu: http://www.codeproject.com/KB/webforms/HidingProperties.aspx#

+0

To prawda .. dzięki. co oznacza ("<{0}: MyControl runat =" server ">")? czy to z ASP? Używam WinForms ... –

+0

Tak. Możesz zignorować tę część dla WinForm. Zaktualizuję moją odpowiedź. – Mrchief

+0

Próbowałem, ale to nie pomogło. Czy to działa podczas RUNTIME? –