PropertyGrid ... dla użytkowników Chciałbym zostawić tylko kilka z nich. Ale teraz widzę wszystko, a użytkownicy będą zdezorientowani kiedy zobaczyć coś takiego Dock lub kursor i tak ... nadzieję, że to jasne dla teraz ...PropertyGrid: Ukryj właściwości klasy bazowej, jak?
Odpowiedz
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";
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#
To prawda .. dzięki. co oznacza ("<{0}: MyControl runat =" server "> {0}: MyControl>")? czy to z ASP? Używam WinForms ... –
Tak. Możesz zignorować tę część dla WinForm. Zaktualizuję moją odpowiedź. – Mrchief
Próbowałem, ale to nie pomogło. Czy to działa podczas RUNTIME? –
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. –
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. –
Lars, przeczytaj moją odpowiedź. To było dokładnie to, czego potrzebowałem ... –