2010-05-03 17 views
5

[EDIT] Per essere chiari, so come ottenere un elenco di moduli tramite riflessione. Sono più interessato alla griglia delle proprietà del tempo di progettazione.Proprietà di Visual Studio Design Time - Elenco elenco a discesa

Ho un controllo utente con una proprietà pubblica del tipo Form.
Desidero poter selezionare un modulo in fase di progettazione da un menu a discesa.
Desidero popolare l'elenco a discesa del modulo da uno spazio dei nomi impostato: UI.Foo.Forms

Ciò funzionerebbe come se fosse di proprietà pubblica di Control. In fase di progettazione, la proprietà popolerà automaticamente un menu a discesa con tutti i controlli sul modulo, da cui selezionare. Voglio solo popolarlo con tutte le forme in un namespace.

Come faccio a fare questo? Spero di essere abbastanza chiaro, quindi non c'è confusione. Sto cercando alcuni esempi di codice se possibile. Sto cercando di evitare di dover passare troppo tempo su questo quando ho altre scadenze da rispettare.

Grazie per il vostro aiuto in anticipo.

risposta

7

Si può facilmente ottenere le classi mediante Reflection:

var formNames = this.GetType().Assembly.GetTypes().Where(x => x.Namespace == "UI.Foo.Forms").Select(x => x.Name); 

Supponendo che si sta chiamando questo dal codice nello stesso assembly come i moduli, otterrai i nomi di tutti i tipi che sono in Spazio dei nomi "UI.Foo.Forms". È quindi possibile presentare questo nel menu a discesa e, infine, creare un'istanza a seconda di quale viene selezionato dall'utente attraverso la riflessione, una volta di più:

Activator.CreateInstance(this.GetType("UI.Form.Forms.FormClassName")); 

[Edit] Aggiunta di codice per la roba fase di progettazione:

Sul controllo che possibile creare una proprietà Form come tale:

[Browsable(true)] 
[Editor(typeof(TestDesignProperty), typeof(UITypeEditor))] 
[DefaultValue(null)] 
public Type FormType { get; set; } 

Quali riferimenti del tipo di editor che deve essere definito. Il codice è piuttosto auto-esplicativo, con una minima quantità di ritocchi, sarà probabilmente in grado di farlo produrre esattamente quello che vuoi.

public class TestDesignProperty : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.DropDown; 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 

     ListBox lb = new ListBox(); 
     foreach(var type in this.GetType().Assembly.GetTypes()) 
     { 
      lb.Items.Add(type); 
     } 

     if (value != null) 
     { 
      lb.SelectedItem = value; 
     } 

     edSvc.DropDownControl(lb); 

     value = (Type)lb.SelectedItem; 

     return value; 
    } 
} 
+0

Ho saputo come ottenere l'elenco dei moduli, ma non so esattamente come ottenere questi popolati nella griglia della proprietà in fase di progettazione, in vista di progettazione, per la mia proprietà pubblica. –

+0

Aggiornamento della mia risposta per soddisfare i requisiti di progettazione. – CMerat

+1

Grazie Merat, devo aspettare altre 14 ore per accettare (andare a caccia di tacchino, quindi potrebbe essere un paio di giorni :), ma ha funzionato perfettamente. –

2

La discesa non si chiude quando elemento viene selezionato facendo clic su di esso, quindi questo potrebbe essere utile:

assegnare il gestore di eventi click per la casella di riepilogo e aggiungere la funzione del gestore di eventi

public class TestDesignProperty : UITypeEditor 
{ 

    // ... 

    IWindowsFormsEditorService editorService; 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
     { 
      // ... 
      editorService = edSvc ; // so can be referenced in the click event handler 

      ListBox lb = new ListBox(); 
      lb.Click += new EventHandler(lb_Click); 
      // ... 
     } 



    void lb_Click(object sender, EventArgs e) 
    { 
     editorService.CloseDropDown(); 
    } 

} 
Problemi correlati