.NET Base: Fremde Controls im Designer um zusätzliche Eigenschaften erweitern - .NET Base

Zum Inhalt wechseln

Seite 1 von 1
  • Du kannst kein neues Thema erstellen
  • Antworten nicht möglich

Fremde Controls im Designer um zusätzliche Eigenschaften erweitern

Geschrieben 30. Jan 2010 - 19:38 (#1) Mitglied ist offline   Maximilian 

  • caffeine addicted
  • Gruppe: Administratoren
  • Beiträge: 846
  • Registriert: 10. Sep. 09
  • Wohnort: Im dicken B oben an der Spree
  • OS: Windows 7 Ultimate (x64)
  • IDE: VS 2010 Premium

Wer schonmal zum Beispiel einen ToolTip oder ErrorProvider benutzt hat, wird das verhalten kennen, dass diese Komponenten in den Eigenschaftenlisten aller Controls zusätzliche Einträge hinzufügen.
Dieses Verhalten läßt sich durch das Implementieren der Schnittstelle IExtenderProvider sowie des Attributes ProvidePropertyAttribute nachbilden.

IExtenderProvider
Dieses Interface implementiert nur eine Funktion:

Visual C#
bool CanExtend(object extendee);


Anhand dieser Funktion kann man bestimmen welche Objekte um die Eigenschaft(en) erweitert werden sollen. Als Beispiel möchte ich alle Elemente welche vom Typ Control ableiten erweitern, einzige Ausnahme ist die Form:

Visual C#
public bool CanExtend(object extendee)
{
    return (extendee is Control) && !(extendee is Form);
}


ProvidePropertyAttribute
In diesem Attribut werden die einzelnen Eigenschaften definiert, um welche die anderen Controls erweitert werden sollen. Angegeben werden muss der Name der Eigenschaft als String sowie der Typ des Zielcontrols als Type oder String:

Visual C#
[ProvidePropertyAttribute("AllowHide", typeof(Control))]
public class myComponent {
    // ...
}


Korrespondierend zu den Attributen benötigt man für jedes Attribut zwei Methoden zum Get und Set der Eigenschaften. Die Namen für diese Funktionen sind vorgegen und müssen wie folgt aufgebaut sein:
public [Datentyp] Get[Name der Eigenschaft welche auch im Attribut verwendet wurde] ([Typ des Controls welche um diese Eigenschaft erweitert wurde] control) { /* ... */ }
public void Set[Name der Eigenschaft welche auch im Attribut verwendet wurde] ([Typ des Controls welche um diese Eigenschaft erweitert wurde] control, [Datentyp] value) { /* ... */ }

Angewandt auf das Beispielattribut von oben könnten die beiden Methoden wie folgt aussehen:

Visual C#
public bool GetAllowHide(Control control)
{
    return getControlItem(control).AllowHide; // <- Hilfsfunktion welche ich später erkläre
}
public void SetAllowHide(Control control, bool value)
{
   getControlItem(control).AllowHide = value; // <- Hilfsfunktion welche ich später erkläre
}


Zusätzlich zum Interface und Attribut(ten) benötigt man noch eine Klasse welche als Wrapper für die Controlinstanzen sowie die zusätzlichen Eigenschaften dient. In meinem Beispiel sieht dieser Wrapper wie folgt aus:

Visual C#
/// <summary>
/// Wrapperklasse zum vereinen von Controlinstanz und zusätzlichen Eigenschaften.
/// </summary>
public class controlItem
{
    public controlItem(Control sControl, myComponent sComponent)
    {
        controlInstance = sControl;
        componentInstance = sComponent;
        AllowHide = true;
        //An dieser Stelle kann man Events von der jeweiligen Controlinstanz abonieren
        //um entsprechend reagieren zu können.
        controlInstance.VisibleChanged += new EventHandler(instanceControl_VisibleChanged);
    }
 
    //Flag welches temporär gesetzt werden muss um einen Stackoverflow zu verhindern
    private bool flag = false;

     //Beispiel 
    void instanceControl_VisibleChanged(object sender, EventArgs e)
    {
        if (!AllowHide && !(sender as Control).Visible && !flag)
        {
            flag = true;
            controlInstance.Visible = true;
            flag = false;
        }
    }

    /// <summary>
    /// Gibt die Controlinstanz wieder oder legt diese fest.
    /// </summary>
    public Control controlInstance { get; set; }
    
    /// <summary>
    /// Gibt die Komponenteninstanz zurück oder legt diese fest.
    /// </summary>
    public myComponent componentInstance { get; set; }
    
    /// <summary>
    /// Gibt an ob das Control versteckt werden darf oder legt dieses fest.
    /// </summary>
    public bool AllowHide { get; set; }
}


Zum Verwalten der Controlinstanzen nutze ich eine Hashtable und eine Hilfsfunktion zum abrufen und setzen der einzelnen controlItems (siehe kompletten Beispielcode unten) und deren neuen Eigenschaften.
Das folgende komplette Beispiel fügt allen Steuerelementen (außer der Form) eine neue Eigenschaft ("AllowHide") hinzu. Ist diese auf False gesetzt ist es nicht möglich diese Controls mit Visible=False oder der Methode Hide() zu verstecken. Über den Sinn bzw. Unsinn müssen wir nicht diskutieren, dieses dient nur als Beispiel zur Veranschaulichung :)

Spoiler


Ich hoffe das war verständlich erklärt, ansonsten einfach nachfragen :)

Cheerio

Dieser Beitrag wurde von Maximilian bearbeitet: 03. Feb 2010 - 17:04

Mit freundlichen Grüßen
Eingefügtes Bild
MaximilianKrauss.Net | updateSystem.NET

"Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."


Unterstütze qualitative Beiträge durch ein Klick auf Eingefügtes Bild.
0

Thema verteilen:


Seite 1 von 1
  • Du kannst kein neues Thema erstellen
  • Antworten nicht möglich


Similar Topics Collapse

  Thema Forum Themenstarter Statistik Letzter Beitrag
Neue Antworten Symbol Eigene Eigenschaften im Eigenschaftenfenster einstellen C# wsl 
  • 4 Antworten
  • 914 Aufrufe
Neue Antworten Symbol Visual Controls Sammlung Coffeehouse Razer 
  • 0 Antworten
  • 179 Aufrufe
Neue Antworten Symbol ein Prozess für mehrere Controls C# pasi 
  • 4 Antworten
  • 169 Aufrufe
Neue Antworten Symbol Wartezeiten bei UserControls mit vielen Controls Allgemeines wsl 
  • 3 Antworten
  • 336 Aufrufe
Neue Antworten Symbol Anhänge Word erweitern
Text an Blog/Forum/CMS senden
Coffeehouse ragtek 
  • 3 Antworten
  • 280 Aufrufe

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0


Enter your sign in name and password


Sign in options
Mit OpenID anmelden Mit Windows Live anmelden   Or sign in with these services