Pergunta

Eu tenho várias formas em um aplicativo C #. Eu uso o Visual Studio 2010 Beta, mas .NET 3.5 e C # 3.

Eu tenho um formulário base, chamada FilteredQueryViewForm no namespace Shd e quero algumas outras formas de herdar-lo (porque eles basicamente vai fazer a mesma coisa, mas com algumas adições).

Eu mudei coisas do privado ao protegida na classe FilteredQueryViewForm, por isso eles são acessível a partir das formas derivadas. Depois disso, eu criei uma forma derivada e definir a classe base para FilteredQueryViewForm.

O designer da classe derivada reclamou Shd.FilteredQueryViewForm não ter nenhum construtor ... independentemente do fato de que tinha um, com 3 parâmetros. Pensei parâmetros pode ser um problema, então eu também criou um (público, claro) construtor sem parâmetros, mas ainda não funciona. A mensagem de erro é o mesmo:

"Construtor no tipo 'Shd.FilteredQueryViewForm' não foi encontrado."

E o designer da classe derivada não será carregado. Eu tentei reiniciar vs2010beta, re-criando a forma derivada, mas nada parece ajudar. Google não deu qualquer resultado útil para mim sobre este problema. : (

Este é um problema do Visual Studio 2010 Beta? Ou estou fazendo algo errado?

Foi útil?

Solução

Você vai precisar de um construtor sem parâmetros que chama o método InitializeComponent () em todas as suas formas. Em seguida, feche a janela do desenhador, reconstruir a solução e tentar reabrir o designer. Isso deve funcionar. Reconstruir a solução é essencial.

O problema é que, se você criar um formulário que inheritates de Shd.FilteredQueryViewForm, o designer vai tentar chamar o construtor do formulário pai, mas ele carrega essa forma não a partir do código, mas de que é construído montagem.

Outras dicas

Eu sei que é um tópico antigo, mas essas coisas acontecem novamente, então eu acho que a minha contribuir pode ser útil no futuro.

Emiswelt diz: "Você vai precisar de um construtor sem parâmetros que chama o método InitializeComponent () em todas as suas formas." Esta não é realmente necessário. Você pode declarar um construtor personalizado parametrizado na forma derivada e chamar normalmente método "InitializeComponent" (com uma chamada para um contructor personalizado também). O importante é que as chamadas do construtor "InitializeComponent" (para novos controles) e chamadas de construtor base "InitializeComponent" (para componentes herdados). Esta situação vai trabalhar em tempo de execução, mas você não verá controles herdados no Visual Designer Studio. Para mostrar todos os controles em tempo de design que você só deve adicionar um simples contructor sem parâmetros na classe base.

Por exemplo, se sua base é um formulário com um botão e dois botões de opção:

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

Você pode vê-lo na ferramenta de design e você pode evitar o construtor em branco (sem parâmetros) sem problemas. O Form2 agora é herdada 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();
        }
    }
}

Não há nenhum construtor vazio e ele irá compilar e executar normalmente. No rutime seu Form2 irá mostrar o mesmo conjunto controle como Form1. Mas ... você não pode vê-lo em tempo de design porque o Visual Studio não é possível identificar onde método "InitializeComponent" é e um erro é mostrado. Por quê? Porque deve haver um construtor sem parâmetros em algum lugar na cadeia das chamadas. A solução é uma simples modificação na classe 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();
        }
    }
}

Isso é tudo.

Eu acho que você quis que a sua Form1.cs [design] não actualizar quando você adicionou a sua classe base. Eu tive o mesmo problema. Estranhamente, o programa será executado muito bem quando você pressionar começar, e você verá seus componentes de classe de base no seu formulário quando você executá-lo, mas não quando você está no modo de edição.

Apenas clique duas vezes em Form1.cs na Solution Explorer. Ela trabalhou para mim. Faça isso

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top