Não é possível visualizar o designer ao codificar um formulário em c #

Estou seguindo este tutorial sobre winforms, e até agora o tutorial está codificando o formulário sem usar a checkbox de ferramentas. Acredito que apresentará a checkbox de ferramentas com mais profundidade em breve.

Seguindo o tutorial, fiz uma aula parcial nas duas partes de código a seguir:

Primeiro arquivo :

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

Segundo arquivo :

 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 executo o código com F5, tudo parece bem: o formulário aparece com a checkbox de texto.

Mas, por algum motivo, quando clico com o botão direito no segundo arquivo e escolho “View Designer”, recebo um erro que diz “A variável ‘txtbox’ não é declarada ou nunca foi atribuída”. Posso escolher “Ignorar e continuar”, o que me leva a um formulário sem checkbox de texto.

Por que isso ocorre? Eu sei que alguns de vocês acham que eu deveria usar apenas a checkbox de ferramentas, e é provavelmente a coisa mais sensata a se fazer, mas eu ainda gostaria de entender por que isso acontece.

Quando você abre um Form no designer de formulários do Windows, o designer analisa a primeira class no arquivo. Se o arquivo tiver um Designer.cs contendo a outra parte parcial da class, também o includeá e tentará desserializar o conteúdo desse arquivo. No processo de desserialização e carregando o tempo de design do formulário, ele cria uma instância da class base do formulário e examina esses arquivos para declarações de componente e o método InitializeComponents . Se encontrá-los cria componentes e define propriedades deles usando códigos desserializados e adicionar componentes à instância da class base criada.

Alguns fatos úteis:

  • Os códigos no construtor do seu Form não serão executados no tempo de design, mas o construtor da class base do formulário será executado em tempo de design.
  • Códigos no InitializeComponent não serão executados em tempo de design, mas esses códigos serão desserializados e serão usados ​​para criar o designer do formulário.
  • O designer não pode mostrar um formulário que tenha uma class base abstrata. ( solução )
  • O designer não pode mostrar um formulário que tenha class genérica. Por exemplo, não pode mostrar MyForm:SomeForm , mas pode mostrar SomeForm:Form . ( solução )
  • Se você definir uma nova propriedade para o seu formulário, as propriedades não serão exibidas na janela de propriedades. A janela de propriedades, mostra as propriedades da class base, mas com valores do seu formulário.
  • Quando um arquivo contém 2 classs, se o formulário não foi a primeira class, o designer não pode carregar e você recebe um aviso que diz que o formulário deve ser de primeira class para ser exibido no designer.
  • As regras acima também se aplicam a UserControls.

Exemplo

Dê uma olhada no código abaixo, que tem alguns problemas sérios:

  • A class tem um construtor diferente do nome da class
  • A declaração int i="x";
  • Não há ponto e vírgula enquanto esta é uma class c #
  • O método InitializeComponent não chamou o construtor

Mas a notícia interessante é que você pode ver o formulário no designer, mesmo com esses erros!

Basta criar um arquivo em seu projeto e colocar os códigos abaixo no arquivo, salvá-lo e fechá-lo. Então, sem tentar construir a solução, abra o formulário no designer. Aqui está o código:

 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 aqui está uma imagem do designer:

insira a descrição da imagem aqui

Mais Informações

Para encontrar mais informações, dê uma olhada neste link:

  • Como o designer do Windows Forms no Visual Studio carrega um formulário?

Solução para sua pergunta

Como solução, basta você mover private Numeric txtbox; e coloque seu arquivo seccond na class Exercise .

A declaração dos controles deve ser colocada em arquivos Designer.cs para que o Visual Studio possa apenas compilar esta unidade e exibi-la.

Quando você inicia o aplicativo, o compilador leva em consideração todas as partes da sua class parcial e depois encontra a declaração do txtBox.

Tente deixar apenas a class de formulário com suas declarações gráficas em um único arquivo. Este arquivo único deve ter InitializeComponent methdod, construcutor e declarações de campo de componentes de interface do usuário inicializados em InitializeComponent ().