Imansible visualizzare il designer durante la codifica di un modulo in C #

Sto seguendo questo tutorial su winforms e finora il tutorial sta codificando il modulo senza utilizzare la toolbox. Credo che introdurrà gli strumenti in modo più approfondito a breve.

Seguendo il tutorial, ho creato una class parziale nei seguenti due pezzi di codice:

Primo file :

using System; using System.Windows.Forms; public class Numeric : System.Windows.Forms.TextBox { public Numeric() { } } public partial class Exercise { private Numeric txtbox; System.ComponentModel.Container components; } 

Secondo file :

 using System; using System.Windows.Forms; public partial class Exercise : Form { private void InitializeComponent() { txtbox = new Numeric(); Controls.Add(txtbox); } public Exercise() { InitializeComponent(); } } public class program { public static int Main() { Application.Run(new Exercise()); return 0; } } 

Quando eseguo il codice con F5, tutto sembra a posto: il modulo si apre con la casella di testo.

Ma per qualche ragione, quando clicco con il tasto destro sul secondo file e scelgo “Visualizza Designer”, viene visualizzato un errore che dice “La variabile ‘txtbox’ è non dichiarata o non è mai stata assegnata”. Posso scegliere di “Ignora e continua”, che mi porta a un modulo senza casella di testo.

Perché succede? So che alcuni di voi pensano che dovrei semplicemente usare la cassetta degli attrezzi, ed è probabilmente la cosa più sensata da fare, ma mi piacerebbe comunque capire perché questo accade.

Quando si apre un Form in Windows Form Designer, il progettista esamina la prima class del file. Se il file ha un Designer.cs contiene l’altra parte parziale della class, lo include anche e tenta di deserializzare quei contenuti del file. Nel processo di deserializzazione e caricamento del tempo di progettazione del modulo, crea un’istanza della class base del modulo e cerca in quei file le dichiarazioni dei componenti e il metodo InitializeComponents . Se li trova crea componenti e ne imposta le proprietà utilizzando codici deserializzati e aggiunge componenti all’istanza della class base che ha creato.

Alcuni fatti utili:

  • I codici nel costruttore del Form non verranno eseguiti in fase di progettazione, ma il costruttore della class base del modulo verrà eseguito in fase di progettazione.
  • I codici in InitializeComponent non verranno eseguiti in fase di progettazione, ma quei codici verranno deserializzati e verranno utilizzati per creare il designer del modulo.
  • Il progettista non può mostrare un modulo che abbia una class base astratta. ( soluzione )
  • Il progettista non può mostrare un modulo con class generica. Ad esempio, non può mostrare MyForm:SomeForm , ma può mostrare SomeForm:Form . ( soluzione )
  • Se si definisce una nuova proprietà per il modulo, le proprietà non verranno visualizzate nella finestra delle proprietà. La finestra delle proprietà mostra le proprietà della class base ma con i valori del modulo.
  • Quando un file contiene 2 classi, se il modulo non era la prima class che il progettista non può caricare e si riceve un avviso che dice che il modulo dovrebbe essere di prima class da mostrare nel designer.
  • Le regole di cui sopra si applicano anche a UserControls.

Esempio

Dai un’occhiata al codice qui sotto, che ha alcuni problemi seri:

  • La class ha un costruttore diverso dal nome della class
  • L’istruzione int i="x";
  • Non c’è punto e virgola mentre questa è una class C #
  • Il metodo InitializeComponent non ha chiamato nel costruttore

Ma la notizia interessante è che puoi vedere il modulo nel designer, anche con quegli errori!

Basta creare un file nel progetto e inserire i seguenti codici nel file e salvare il file e chiuderlo. Quindi, senza provare a creare la soluzione, aprire il modulo in Designer. Ecco il codice:

 using System using System.Windows.Forms namespace SampleApplication { public class MyForm:Form { public NotMyForm() { } public void InitializeComponent() { int i="x"; textBox1 = new TextBox() textBox1.Text = "Hi" this.Controls.Add(textBox1) } private TextBox textBox1 } } 

E qui c’è lo screenshot del designer:

inserisci la descrizione dell'immagine qui

Maggiori informazioni

Per trovare maggiori informazioni, dai un’occhiata a questo link:

  • In che modo la finestra di progettazione di Windows Form in Visual Studio carica un modulo?

Soluzione per la tua domanda

Come soluzione, è sufficiente spostare il private Numeric txtbox; e metti il ​​tuo file seccond nella class Exercise .

La dichiarazione dei controlli deve essere inserita nei file Designer.cs in modo che Visual Studio possa semplicemente compilare questa unità e visualizzarla.

Quando avvii l’app, il compilatore prende in considerazione tutte le parti della tua class parziale, quindi trova la dichiarazione txtBox.

Prova a lasciare solo la class del modulo con le sue dichiarazioni grafiche in un singolo file. Questo singolo file dovrebbe avere InitializeComponent methdod, construcutor e dichiarazioni di campo dei componenti dell’interfaccia utente inizializzati in InitializeComponent ().