8

Tengo varios formularios en una aplicación C#. Uso Visual Studio 2010 Beta, pero .NET 3.5 y C# 3.Formulario .NET heredado (WinForms) - Problema del diseñador VS

Tengo un formulario base, llamado FilteredQueryViewForm en el espacio de nombres Shd y quiero que otros formularios lo hereden (porque básicamente harán lo mismo, pero con algunas adiciones).

Cambié las cosas de privadas a las protegidas en la clase FilteredQueryViewForm, por lo que se puede acceder a ellas desde los formularios derivados. Después de esto, he creado un formulario derivado y he establecido la clase base en FilteredQueryViewForm.

El diseñador de la clase derivada se quejó de que Shd.FilteredQueryViewForm no tenía constructores ... independientemente de que tuviera uno, con 3 parámetros. Pensé que los parámetros pueden ser un problema, así que también creé un constructor (público, por supuesto) sin parámetros, pero todavía no funciona. El mensaje de error es el mismo:

"Constructor en tipo 'Shd.FilteredQueryViewForm' no encontrado."

Y el diseñador de la clase derivada no se cargará. He intentado reiniciar vs2010beta, volviendo a crear el formulario derivado, pero nada parece ayudar. Google no produjo ningún resultado útil para mí en este problema. :(

¿Es un problema de Visual Studio 2010 Beta? O estoy haciendo algo mal?

Respuesta

19

Tendrá un constructor sin parámetros que llama al método InitializeComponent() en cada una de sus formas. A continuación, cierre la ventana del diseñador, reconstruya la solución e intente reabrir el diseñador. Eso debería funcionar. Reconstruir la solución es esencial.

El problema es que si crea un formulario que hereda de Shd.FilteredQueryViewForm, el diseñador intentará llame al constructor del formulario primario, pero carga este formulario no desde el código, sino desde su ensamblado construido.

+0

Gracias, reconstruir la solución fue el paso que eché de menos. – ShdNx

0

Creo que quería decir que su Form1.cs [diseño] no se actualizó cuando agregó su clase base. Yo tuve el mismo problema. Por extraño que parezca, el programa funcionará bien cuando presiones el inicio, y verás los componentes de tu clase base en tu Formulario cuando lo ejecutes, pero no cuando estés en el modo de edición.

Simplemente haga doble clic en Form1.cs en el explorador de soluciones. Funcionó para mí Do this

1

Sé que es un tema viejo, pero estas cosas vuelven a pasar, por lo que creo que mi contribución podría ser útil en el futuro.

Emiswelt dice "Necesitarás un constructor sin parámetros que llame al método InitializeComponent() en cada uno de tus formularios". Esto no es realmente necesario. Puede declarar un constructor parametrizado personalizado en el formulario derivado y llamar normalmente al método "InitializeComponent" (con una llamada a un contructor personalizado también). Lo importante es que su constructor llama a "InitializeComponent" (para controles nuevos) y al constructor base llama a "InitializeComponent" (para componentes heredados). Esta situación funcionará en tiempo de ejecución, pero no verá controles heredados en el diseñador de Visual Studio. Para mostrar todos los controles en tiempo de diseño, solo debe agregar un contructor simple sin parámetros en la clase base.

Por ejemplo, si su base es un formulario con un botón y dos botones de radio:

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 
     } 
    } 
} 

Se puede ver en la herramienta de diseño y se puede evitar el constructor en blanco (sin parámetros) sin problemas . El Form2 se hereda ahora de 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(); 
     } 
    } 
} 

No hay ningún constructor en blanco y va a compilar y ejecutar normalmente. En tiempo, su Form2 mostrará el mismo conjunto de control que Form1. Pero ... no se puede ver en el momento del diseño porque Visual Studio no puede identificar dónde se encuentra el método "InitializeComponent" y se muestra un error. ¿Por qué? Porque debería haber un constructor sin parámetros en algún lugar de la cadena de llamadas. La solución es una simple modificación en la clase 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(); 
     } 
    } 
} 

eso es todo.

Cuestiones relacionadas