8

Ho diversi moduli in un'applicazione C#. Uso Visual Studio 2010 Beta, ma .NET 3.5 e C# 3.Modulo .NET inherited (WinForms) - problema di progettazione VS

Ho un modulo di base, chiamato FilteredQueryViewForm nello spazio dei nomi Shd e voglio che altre forme lo ereditino (perché fondamentalmente fanno le stesse cose, ma con alcune aggiunte).

Ho modificato le cose da privato a protetto nella classe FilteredQueryViewForm, in modo che siano accessibili dai moduli derivati. Dopo questo ho creato un modulo derivato e impostato la classe base su FilteredQueryViewForm.

Il progettista della classe derivata si è lamentato del fatto che Shd.FilteredQueryViewForm non disponesse di alcun costrutto ... indipendentemente dal fatto che ne avesse uno, con 3 parametri. Ho pensato che i parametri possono essere un problema, quindi ho anche creato un costruttore (pubblico, ovviamente) senza parametri, ma non funziona ancora. Il messaggio di errore è lo stesso:

"Costruttore su tipo 'Shd.FilteredQueryViewForm' non trovato."

E il progettista della classe derivata non verrà caricato. Ho provato a riavviare vs2010beta, ricreando il modulo derivato, ma nulla sembra aiutare. Google non ha prodotto risultati utili per me su questo problema. :(

questo è un problema di Visual Studio 2010 Beta? O sto facendo qualcosa di sbagliato?

risposta

19

Avrete bisogno di un costruttore senza parametri che chiama il metodo InitializeComponent() in ogni delle vostre forme. Poi vicino la finestra del designer, ricostruire la soluzione e provare a riaprire il progettista.Questo dovrebbe funzionare.La ricostruzione della soluzione è essenziale

Il problema è che se si crea un modulo che eredita da Shd.FilteredQueryViewForm, il progettista proverà a chiama il costruttore del modulo padre, ma carica questo modulo non dal codice ma dal suo assembly generato.

+0

Grazie, ricostruire la soluzione è stato il passo che ho perso. – ShdNx

0

Penso che volevi dire che il tuo Form1.cs [design] non si aggiornava quando hai aggiunto la tua classe base. Ho avuto lo stesso problema. Stranamente, il programma funzionerà alla perfezione quando premi start e vedrai i componenti della tua classe base sul tuo Form quando lo esegui, ma non quando sei in modalità di modifica.

Fare doppio clic su Form1.cs su solution explorer. Ha funzionato per me. Do this

1

So che è un argomento vecchio, ma queste cose accadono di nuovo, quindi penso che il mio contributo potrebbe essere utile in futuro.

Emiswelt dice "Avrete bisogno di un costruttore senza parametri che chiama il metodo InitializeComponent() in ciascuna delle vostre forme." Questo non è davvero necessario. È possibile dichiarare un costruttore parametrico personalizzato nel modulo derivato e chiamare normalmente il metodo "InitializeComponent" (con una chiamata a un contructor personalizzato). L'importante è che il costruttore chiami "InitializeComponent" (per i nuovi controlli) e le chiamate del costruttore di base "InitializeComponent" (per i componenti ereditati). Questa situazione funzionerà in fase di esecuzione, ma non vedrai controlli ereditati sul designer di Visual Studio. Per mostrare tutti i controlli in fase di progettazione, è sufficiente aggiungere un semplice contructor senza parametri nella classe base.

Ad esempio, se la base è un modulo con un pulsante e due pulsanti di opzione:

using System.Windows.Forms; 
namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1(string foo) 
     { 
      //use "foo" here 
      InitializeComponent(); //here button and radios will be initialized 
     } 
    } 
} 

si può vedere sullo strumento di progettazione e si può evitare il costruttore vuoto (senza parametri) senza problemi . La Form2 viene ora ereditata dalla Form1:

namespace Test 
{ 
    public partial class Form2 : Form1 
    { 
     public Form2(string foo) : base(foo) 
     { 
      //you can use "foo" here even if it is passed to base class too 
      InitializeComponent(); 
     } 
    } 
} 

Non c'è costruttore vuoto che verrà compilare ed eseguire normalmente. Al rutime il tuo Form2 mostrerà lo stesso set di controllo di Form1. Ma ... non è possibile vederlo in fase di progettazione perché Visual Studio non è in grado di identificare dove è il metodo "InitializeComponent" e viene visualizzato un errore. Perché? Perché dovrebbe esserci un costruttore senza parametri da qualche parte sulla catena delle chiamate. La soluzione è una semplice modifica sulla classe di base:

using System.Windows.Forms; 

namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1(string foo):base() 
     { 
      //use foo here 
     } 

     public Form1()   //Visual studio designer likes this! 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Questo è tutto.

Problemi correlati