Laden...

[gelöst] Forms-Instantiierung: Wie schafft man es dass nur Custom-Member zur Verfügung stehen?

Erstellt von userid4382 vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.414 Views
U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 16 Jahren
[gelöst] Forms-Instantiierung: Wie schafft man es dass nur Custom-Member zur Verfügung stehen?

Hallo,
ich habe einen MessageBox-Ersatz als Item-Template für die Einbindung in Projekte geschrieben. Dahinter verbirgt sich ein ganz normales WinForm mit einer Methode, einer Überladung und einem SystemIcon-Enumerator.
Die Einbindung geschieht über FadingMessageBox fmb = new FadingMessageBox();
Nun zeigt die Instanz aber leider nicht nur meine selbst geschriebenen Member, sondern eben auch alle üblichen Forms-Member. Das ist genau mein Problem. Gibt es eine Möglichkeit diese auszublenden, so daß Intellisense nur meine Methode und den Enumerator anzeigt? Ich hatte schon die Idee, die Instantiierung explizit über ein eigenes Interface laufen zu lassen. Gut und schön, das verhindert aber nicht daß jemand trotzdem eine normale Klassen-Instantiierung macht und sich dann wundert warum er meine Custom-Member nicht sieht.

EDIT: Editiert wegen Tippfehler. Ich hass' das. 😁

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Cyron,

alle Methoden/Properties überschreiben, jeweils als [Browsable(false] kennzeichnen und die jeweilige Oberklassen-Methode/Property aufrufen.

herbivore

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 16 Jahren

Wow, das muss ich gleich ausprobieren. Dankeschön. 👍

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 16 Jahren

Wahrscheinlich bin ich mal wieder blöd. Wenn ich mit override ankomme, erscheint eine Liste mit
(Methode) AdjustFormScrollBars
(Property) AllowDrop
(Property) Anchor
.
.
.

Die Forms-Instanz listet allerdings:
(Property) AcceptButton
(Property) AccessibilityObject
.
.
.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Cyron,

override geht nur bei virtuellen Methode und Properties. Die bei den anderen müsstest du stattdessen new verwenden.

herbivore

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 16 Jahren

Für den Versuch habe ich mir erstmal die Activate-Methode geschnappt und folgendes in die FadingMessageBox-Klasse geschrieben:


[Browsable(false)]
new public void Activate()
{
   base.Activate();
}

In der Instanz listet Intellisense diese Methode aber trotzdem noch auf.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Cyron,

In der Instanz listet Intellisense diese Methode aber trotzdem noch auf.

tja, sollte jedenfalls nicht. Microsoft macht das genau so wie du.

Ist der Typ der Variable denn FadingMessageBox? Nur dann wird ja die new-Methode überhaupt angezogen. Oder ist die Variable vom Typ der Oberklasse? Das würde es erklären. Dann werden natürlich die Member so angezeigt, wie sie in der Oberklasse definiert sind, also normalerweise entsprechend Browsable (true).

Wenn diese Methode sowieso nicht aufzurufen sein soll, warum muß ich dann base.Activate() aufrufen, oder hab ich dich falsch verstanden als du schriebst, ich soll die jeweilige Oberklassen-Methode/Property aufrufen.

Dass sie in IntelliSense nicht angezeigt wird, verhindert nicht, dass man sie aufrufen kann. Deshalb sollten die Methoden auch eine korrekte Implementierung haben. Man kann sich natürlich darüber streiten, was man als korrekt ansieht. Du kannst auch eine NotImplementedException werfen. Aber die Methode einfach leer lassen fände ich merkwürdig.

herbivore

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 16 Jahren

Die Variable ist vom Typ FadingMessageBox, also in Form1 so instantiiert:

FadingMessageBox fmb = new FadingMessageBox();
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Cyron,

ich kanns nicht ausprobieren, ich benutze kein VS. Aber es sollte wie gesagt gehen. Probier es mal mit override bei einer virtuellen Methode. Aber eigentlich sollte es keinen Unterschied machen. Es solle so oder so gehen.

herbivore

O
778 Beiträge seit 2007
vor 16 Jahren

Das BrowsableAttribute ist das falsche Attribute, verwende stattdessen EditorBrowsableAttribute und setz den Wert am besten auf Advanced, damit man ueberhaupt noch rankommt, aber die auch ausblenden kann. Browsable wirkt sich nur auf die Darstellung zB im PropertyGrid aus.

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 16 Jahren

Auch EditorBrowsableAttribute funktioniert bei mir leider nicht. ?(
Ich hab's auch mit dem Beispiel aus der Hilfe probiert; mit dem gleichen Ergebnis.

int ageval;
[EditorBrowsable(EditorBrowsableState.Never)]
public int Age
{ 
    get { return ageval; }
    set 
    {
        if (!ageval.Equals(value)) 
        {
            ageval = value;
        }
    }
}
U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 16 Jahren

UPDATE: Ich bin gerade hier fündig geworden:
http://groups.google.com/group/microsoft.public.dotnet.framework.windowsforms.controls/browse_thread/thread/2f88b987be3948d0?fwc=1

Dort heißt es:

Speaking for C#, the EditorBrowsableAttribute attribute only influences C#
IntelliSense filtering behavior if the decorated item is imported from
metadata.
That's to say, you should compile the EditorBrowsableAttribute-decorated
project(e.g project 1) into an assembly(.dll or .exe) and then in another
project(e.g project 2) add a reference to that assembly. In project 2, you
should see the attribute at work.
C# IntelliSense filtering behavior is not influenced if you are coding in
project 1. What's more, if you add a project-to-project reference to
project 1 in project 2, C# IntelliSense filtering behavior is not
influenced when you are coding in project 2 either.
The IDE is intended to filter items from consumers of your assembly and not
to filter items from yourself as you code the assembly.
Hope this helps.
If you have anything unclear, please don't hesitate to let me know.
Sincerely,
Linda Liu
Microsoft Online Community Support

Auf mein Problem bezogen, bedeutet es kurz: Ich muß die FadingMessageBox als DLL compilen und diese dann in meine anderen Projekte einbinden. Hmm... warum nicht. 8)