2014-07-14 22 views
6

Non sono sicuro che ciò sia possibile. Ho fatto qualche ricerca, ma non sono stato in grado di trovare nulla di conclusivo. C'è una domanda simile here, ma è per WPF.Come aggiungere una proprietà al controllo di Winforms esistente

Quello che mi piacerebbe fare è aggiungere una proprietà personalizzata a un GroupBox WinForms esistente (o qualsiasi controllo) sul mio modulo. Per questo esempio useremo "Link". Dire ogni GroupBox nel mio programma contiene un collegamento ipertestuale, e poi tutto quello che avrebbe bisogno di fare quando comincio il mio programma è fare questo:

MyGroupBox.Link = "http:\\www.google.com\" 

Più tardi nel mio programma ho potuto impostare il mio tenore di collegamento ipertestuale per fare riferimento a MyGroupBox.Link.

È possibile manipolare un controllo Winforms come questo? Preferirei non creare un controllo personalizzato se non dovessi farlo.

Ho visto da this question che avrei potuto estendere il mio controllo, ma come avrei guardato nel mio caso particolare? È lo stesso della creazione di un controllo personalizzato?

+0

Perché non solo sottoclasse GroupBox e aggiungi la proprietà? –

+0

@Savanna Sfortunatamente, non ho idea di come farlo. Potresti postare una risposta? – gnarlybracket

+1

Ogni controllo in WinForms ha ['Tag'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.tag (v = vs.110) .aspx) proprietà che fondamentalmente solo 'oggetto', quindi puoi impostare qualsiasi dato ad esso, e usarlo. È possibile impostare qualsiasi URL su di esso, quindi recuperarlo e tornare alla stringa. –

risposta

5

Non ho provato questo con GroupBox, ma sto pensando che si potrebbe fare qualcosa di simile all'esempio con Button qui.

http://msdn.microsoft.com/en-us/library/7h62478z(v=vs.90).aspx

basta creare una nuova classe, lo chiamano MyGroupBox o quello che vuole:

public class MyGroupBox : GroupBox { 
    private string link; 

    public string Link {get {return link;} set{link=value;} } 
} 

Questa eredita tutti i comportamenti/oggetti di GroupBox e aggiunge una nuova proprietà per un collegamento.

allora si può solo usare in questo modo:

MyGroupBox groupBox = new MyGroupBox(); 
groupBox.Link = "www.google.com"; 

Penso che questo è più pulita utilizzando la proprietà tag, onestamente. Principalmente perché non è un tag, è un link e mi piace poter denominare la proprietà in modo appropriato. :) Sebbene il tag potrebbe essere più semplice se hai bisogno di farlo per molti controlli e non solo GroupBox.

+0

Grazie per la tua risposta! Come utilizzerei questo se desiderassi posizionare i miei GroupBox con il designer? – gnarlybracket

+0

Non l'ho fatto da solo, ma questo articolo sembra spiegare come farlo. http://www.blackwasp.co.uk/VSControlInToolbox.aspx In realtà è anche una buona scoperta per me, in passato ho sempre smesso di usare il designer quando uso un controllo personalizzato. Sembra essere davvero facile aggiungere i controlli alla casella degli strumenti ... buono a sapersi. –

3

Un modo sarebbe quello di utilizzare Extender Providers.They agire come componente ToolTip quando viene aggiunto a un modulo, esso fornisce una proprietà chiamata ToolTip ad ogni controllo su quel form.You potrebbe creare questa classe:

[ProvideProperty("Link", typeof(Control))] 
    public class ExtendControls : Component, IExtenderProvider 
    { 
     private Dictionary<Control, string> links = 
            new Dictionary<Control, string>(); 

     public bool CanExtend(object extendee) 
     { 
      return !(extendee is Form); 
     } 

     public void SetLink(Control extendee, string value) 
     { 
      if (value.Length == 0) 
      { 
       links.Remove(extendee); 
      } 
      else 
      { 
       links[extendee] = value; 
      } 
     } 

     [DisplayName("Link")] 
     [ExtenderProvidedProperty()] 
     public string GetLink(Control extendee) 
     { 
      if (links.ContainsKey(extendee)) 
      { 
       return links[extendee]; 
      } 
      else 
      { 
       return string.Empty; 
      } 
     } 
    } 

Quello che fa è che fornirà la proprietà Link a tutti i controlli tranne il modulo. Ora puoi creare questa classe nel tuo progetto windowsforms e crearla, dopo che avrai visitato il designer del modulo nella toolbox dovresti vedere il componente extendcontrols trascinalo sul Form e verrà inserito nella barra dei componenti. Al termine ... puoi usare la tua nuova proprietà Link nella finestra delle proprietà sul controllo desiderato o in un codice come questo (supponendo che tu abbia lasciato egli componente al suo nome di default):

//assuming ofcourse you have a button called button1 
//i used button as the example you can use panel,datagridview,label,etc... 
//to set it... 
extendControls1.SetLink(button1, "sometest"); 
//to get it back... 
string myLink = extendControls1.GetLink(button1); 
0

In risposta a Savanna, si può semplicemente creare il classe estesa utilizzando il metodo descritto savana, e quindi trascinare la classe reale alla casella degli strumenti. Magicamente, lo avrai nella tua cassetta degli attrezzi, pronto per trascinarti nel tuo modulo in modalità designer, completo di qualsiasi proprietà personalizzata che hai aggiunto.