Невозможно просмотреть конструктор при кодировании формы в C #

Я следую этому руководству по winforms, и до сих пор учебник кодирует форму без использования инструментария. Я считаю, что в ближайшее время он представит инструментарий.

После учебника я сделал частичный class в следующих двух частях кода:

Первый файл :

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

Второй файл :

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

Когда я запускаю код с F5, все выглядит нормально: форма появляется с помощью текстового поля.

Но по какой-то причине, когда я щелкаю правой кнопкой мыши по второму файлу и выбираю «View Designer», я получаю сообщение об ошибке: «Переменная txtbox« либо не объявлена, либо никогда не была назначена ». Я могу выбрать «Игнорировать и продолжить», что приводит меня к форме без текстового поля.

Почему это происходит? Я знаю, что некоторые из вас думают, что я должен просто использовать панель инструментов, и это, вероятно, самая разумная вещь, но я все равно хотел бы понять, почему это происходит.

Когда вы открываете конструктор форм в конструкторах окон, дизайнер смотрит на первый class в файле. Если файл имеет Designer.cs содержащий другую частичную часть classа, также включает его и пытается десериализовать содержимое этого файла. В процессе десериализации и загрузки времени разработки вашей формы он создает экземпляр базового classа вашей формы и просматривает эти файлы для деклараций компонентов и метода InitializeComponents . Если их найти, они создают компоненты и задают их свойства с помощью десериализованных кодов и добавляют компоненты к экземпляру созданного базового classа.

Некоторые полезные факты:

  • Коды в конструкторе вашей Form не будут выполняться во время разработки, но конструктор базового classа вашей формы будет выполняться во время разработки.
  • Коды в InitializeComponent не будут выполняться во время разработки, но эти коды будут десериализованы и будут использоваться для создания конструктора формы.
  • Дизайнер не может отображать форму, которая имеет абстрактный базовый class. ( решение )
  • Дизайнер не может показать форму, которая имеет общий class. Например, он не может отображать MyForm:SomeForm , но он может отображать SomeForm:Form . ( решение )
  • Если вы определяете новое свойство для своей формы, свойства не будут отображаться в окне свойств. Окно свойств показывает свойства базового classа, но со значениями вашей формы.
  • Когда файл содержит 2 classа, если форма не была первым classом, конструктор не может загрузить, и вы получите предупреждение, в котором говорится, что форма должна быть первой для отображения в дизайнере.
  • Выше правила будут применяться также к UserControls.

пример

Взгляните на код ниже, который имеет некоторые серьезные проблемы:

  • Класс имеет другой конструктор, чем имя classа
  • Утверждение int i="x";
  • Нет точки с запятой, в то время как это class C #
  • Метод InitializeComponent не вызывал конструктор

Но интересная новость заключается в том, что вы можете увидеть форму в дизайнере, даже с этими ошибками!

Просто создайте файл в своем проекте и поместите ниже кода в файл и сохраните файл и закройте его. Затем, не пытаясь построить решение, откройте форму в дизайнере. Вот код:

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

И вот скриншот дизайнера:

введите описание изображения здесь

Больше информации

Чтобы найти дополнительную информацию, ознакомьтесь с этой ссылкой:

  • Как конструктор Windows Forms в Visual Studio загружает форму?

Решение для вашего вопроса

В качестве решения вам достаточно перемещать private Numeric txtbox; и поместите его в файл seccond в classе Exercise .

Объявление элементов управления должно быть помещено в файлы Designer.cs, чтобы Visual Studio могла просто скомпилировать данное устройство и отобразить его.

Когда вы запускаете приложение, компилятор учитывает все части вашего частичного classа, тогда он находит объявление txtBox.

Попробуйте оставить только class формы с его графическими объявлениями в одном файле. Этот единственный файл должен иметь InitializeComponent metdod, construcutor и полевые декларации компонентов пользовательского интерфейса, инициализированных в InitializeComponent ().

  • Как заставить курсор переходить к курсору ожидания?
  • показать форму windows из windows службы
  • Как проверить, открыта ли форма для Windows, и закрыть ее, если она есть?
  • Список vs BindingList Преимущества / Недостатки
  • Изменение размера изображения пропорционально ограничениям MaxHeight и MaxWidth
  • Отображение подсказки при наведении курсора мыши на текст
  • Общий базовый class для WinForm UserControl
  • Как сделать установщик для моего приложения C #?
  • Как узнать, что пользователь нажал кнопку «X» или «Закрыть»?
  • Можно скопировать все свойства определенного элемента управления? (Формы windows C #)
  • Отображение формы Windows на дополнительном мониторе?
  • Давайте будем гением компьютера.