2009-06-25 10 views
9

Sto facendo alcuni controlli che devono tutti condividere lo stesso aspetto e alcuni comportamenti comuni, sebbene siano pensati per diversi tipi di input. Così ho creato una BaseClass che eredita da UserControl e tutti i miei controlli ereditano da BaseClass.Come accedere ai controlli ereditati nel designer winforms

Tuttavia, se aggiungo controlli per BaseClass nella finestra di progettazione, ad esempio TableLayoutPanel, non riesco ad accedervi quando sto progettando le classi ereditate. Vedo il TableLayoutPanel, ma anche se è "protetto", non posso modificarlo o inserire controlli attraverso il designer. Non ho problemi ad accedervi per codice, ma non voglio perdere la possibilità di usare il designer.

Al momento, ho semplicemente rimosso tutti i controlli da BaseClass, aggiunto il layout e tutti i controlli comuni in ciascuna classe ereditata, quindi uso i riferimenti per manipolarli all'interno di BaseClass. Ma questo non mi soddisfa affatto. C'è un modo per far funzionare il designer con i controlli dei membri protetti ereditati?

Ambiente: C#, .NET 3.5, Visual Studio 2008

EDIT per rispondere suggerimento di SLaks. Ho provato a impostare una proprietà, e anche se non sono abituato a usarli, non sembra funzionare. Ecco il codice che ho provato:

public partial class UserControl1 : UserControl 
    { 
      public UserControl1() 
      { 
        InitializeComponent(); 
      } 

      public TableLayoutPanel TableLayoutPanel1 
      { 
        get { return tableLayoutPanel1;} 
        set { tableLayoutPanel1 = value;} 
      } 
    } 

    public partial class UserControl2 : UserControl1 
    { 
      public UserControl2() 
      { 
        InitializeComponent(); 
      } 
    } 
+0

Sarebbe possibile ereditare da TableLayoutPanel stesso? – SLaks

+0

Certo, puoi sempre creare il tuo controllo ereditato dal controllo di winforms. L'ho fatto per implementare alcuni controlli. Ma non è quello che sto cercando di ottenere qui. Sto cercando di avere un controllo con diversi controlli di base all'interno: un tablelayoutpanel, con alcuni controlli (come un'etichetta) e diversi spazi vuoti che le classi ereditate dovrebbero riempire con i controlli di loro scelta. L'obiettivo finale è di aggiungere tutti questi controlli alla casella degli strumenti e quindi di drapparli e rilasciarli nella finestra di progettazione per creare moduli con molti controlli ma con un comportamento/layout comune su questi controlli. – Ksempac

+0

E btw, l'ereditare da un controllo Winform taglierà il progettista, poiché di solito il punto è solo quello di implementare un comportamento specifico, non ridisegnare il controllo da soli. – Ksempac

risposta

11

Quando si tenta di accedere dal controllo ereditato con il designer al TableLayoutPanel dichiarato nel controllo di base, si utilizza una funzionalità in WinForms denominata "Ereditarietà visiva".

Purtroppo TableLayoutPanel non supporta l'ereditarietà visiva: http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

Ecco perché il TableLayoutPanel appare bloccato nei controlli ereditati.

+0

Mi sono imbattuto direttamente in questo problema. FTA: "Usa il controllo TableLayoutPanel con parsimonia." –

+0

Sì, sembra un vicolo cieco. Sono stato in grado di trovare la maggior parte del sorgente C# per tablelayout e il designer, ma sembra che non troverò mai i file FlowPanelDesigner.uex associati a questo controllo – garaber

0

Bisogna progettare i controlli di base per conto proprio. Le modifiche si riflettono nel designer dopo aver ricostruito correttamente il progetto di controlli. Se rendi pubblici i membri puoi modificarli ma le modifiche non permarranno.

+0

Impostare le righe, le colonne e le dimensioni di un TableLayoutPanel nella classe base è ciò che vorrei fare.Ma è inutile se non riesco ad aggiungere controlli nel layout quando sto progettando la classe derivata. Ad esempio avere una cella vuota nel mio tablelayout, e quindi aggiungere, tramite il designer, un controllo diverso in ciascuna classe derivata in questa cella. – Ksempac

+0

Non è possibile modificare il controllo di base mentre si progetta il controllo derivato. Non facilmente comunque. Se rendi pubblici gli "spazi vuoti" (ad es. EmptyPanel1, EmptyPanel2, ...) fornisci il tuo TypeEditor per loro, permettendoti almeno di impostare visivamente i controlli. Creare un editor di tipi è un po 'di lavoro però. –

1

Prova ad aggiungere questo attributo alla definizione del pannello (questo può o non può aiutare):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
+0

No, non funziona. – Ksempac

+0

Prova a rendere il campo privato e ad aggiungere quell'attributo a una proprietà pubblica esponendolo. – SLaks

+0

Questo è ciò che fa SplitContainer – SLaks

0

Prova a fare un ParentControlDesigner per il controllo, ignorando InternalControlDesigner, e tornando (designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner). designerHost è (IDesignerHost) component.Site.GetService(typeof(IDesignerHost)).

0

Ricordo vagamente di aver risolto un problema simile mettendo la classe base in una DLL e prima di costruirla. Ho avuto un rovescio ma non riesco a trovare il progetto. Scusate.

Problemi correlati