2010-10-01 4 views
5

Il seguente codice è un controllo personalizzato. Utilizzando questo controllo nel designer di Visual Studio, Visual Studio esegue il CRASH senza dettagli visibili.Il controllo personalizzato causa Visual Studio 2008 a CRASH

sto usando Visual Studio 2008.

sto facendo qualcosa di sbagliato qui?

using System; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 

namespace InstalacionesSayma.GUI 
{ 
    public class CustomControlTest : Panel 
    { 
     private Label _label; 

     public CustomControlTest() 
     { 
      _label = new Label(); 
      this.Controls.Add(_label); 
     } 

     public override Font Font 
     { 
      get 
      { 
       return _label.Font; 
      } 
      set 
      { 
       _label.Font = value; 
      } 
     } 
    } 
} 
+0

Non sono sicuro, ma rimuoverò 'this.Controls.Add (_label);' dal costruttore e lo metto altrove - se hai un * .Design.cs, fai il setup lì forse .. . – FrustratedWithFormsDesigner

risposta

2

VS2005 aveva un talento per schiantarsi sul desktop quando un'eccezione è stata sollevata durante la fase di progettazione. Questo non può essere causato dal codice che hai postato. Dubito che stiamo guardando il codice reale, questo controllo non fa nulla.

Prestare attenzione al costruttore e ai gestori di eventi, inoltre eseguiranno un tempo di progettazione. Se fai qualcosa che dipende in modo critico dallo stato del programma, come provare ad aprire file o parlare con un server dbase eccetera, evita di eseguire tale codice controllando la proprietà this.DesignMode.

5

L'arresto si verifica a causa di ciò che si ha nel comportamento del carattere. Stai ignorando il comportamento previsto della proprietà Font di un pannello. Cambiare il codice di carattere a quello di sotto fa l'incidente andare via:

public override Font Font 
    { 
    get 
    { 
     return base.Font; 
    } 
    set 
    { 
     base.Font = value; 
     _label.Font = value; 
    } 
    } 
2

Credo che il problema è la vostra proprietà Font alla luce della natura di come Designer funziona per quanto riguarda i pannelli e il loro contenuto. Di default il Font dell'etichetta eredita dal Font del suo contenitore (puoi testarlo aggiungendo un pannello a un controllo, quindi aggiungi un'etichetta a quel pannello, quindi cambia il Font del Pannello e viola, l'etichetta - - a meno che tu non ti abbia dato un font non predefinito - si aggiornerà con il nuovo font Font).

Quindi, così com'è, quando il controllo viene aggiunto al modulo, il Font dell'etichetta viene aggiornato per corrispondere al Carattere del contenitore e viene avviato il ciclo infinito.

Sembra che sia possibile risolvere questo problema dando all'etichetta un carattere esplicito quando viene creato. Qualcosa del genere sembra per aggirare il problema:

public CustomControlTest() 
    { 
     _label = new Label(); 
     _label.Font = new Font("Ariel", 8.5f); 
     this.Controls.Add(_label); 
    } 

ETA: In risposta a Hans, sono stato in grado di riprodurre l'incidente utilizzando il codice fornito e VS2008, e sono stato in grado di evitare l'incidente inizializzando il carattere .

ETA2: Nel mio precedente ETA, ho realizzato che la mia risposta poteva sembrare più dura di quanto intendessi. Forse avrei dovuto precisare che non ho visto il crash fino a quando non ho provato ad aggiungere il controllo a un modulo. Hans ha ragione che in sé e per sé, quel codice non dovrebbe causare l'arresto anomalo di Visual Studio ... è quando il progettista interviene per provare a inizializzare e disegnare il controllo in cui si imbatte in problemi. Su quella nota, come si aggiungono commenti direttamente al post di un'altra persona? È necessaria una certa reputazione minima?