Невозможно просмотреть конструктор при кодировании формы в C #
Я следую этому руководству по winforms, и до сих пор учебник кодирует форму без использования инструментария. Я считаю, что в ближайшее время он представит инструментарий.
После учебника я сделал частичный class в следующих двух частях кода:
Первый файл :
- Как определить событие EventGridView CheckBox?
- Получить все элементы управления определенного типа
- Как мы можем показать индикатор выполнения для загрузки с помощью FtpWebRequest
- Как я могу запретить пользователю закрывать мое приложение C #?
- Как создать окно сообщения с параметрами «Да», «Нет» и «Диалоговое окно»?
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« либо не объявлена, либо никогда не была назначена ». Я могу выбрать «Игнорировать и продолжить», что приводит меня к форме без текстового поля.
Почему это происходит? Я знаю, что некоторые из вас думают, что я должен просто использовать панель инструментов, и это, вероятно, самая разумная вещь, но я все равно хотел бы понять, почему это происходит.
- Использует ли Mutex для предотвращения безопасной работы нескольких экземпляров одной и той же программы?
- WinForms DataGridView - привязка к объекту со свойством списка (переменное число столбцов)
- Сбросить RTF в RichTextBox?
- Будет ли Windows Forms устаревшим в пользу WPF?
- Лучший способ получить доступ к элементу управления в другой форме в Windows Forms?
- SynchronizationContext.Current имеет значение null в продолжении в основном streamе пользовательского интерфейса
- Открытие «известного типа файла» в исполняемом экземпляре настраиваемого приложения - .NET
- Как запустить приложение WinForm сведено к минимуму?
Когда вы открываете конструктор форм в конструкторах окон, дизайнер смотрит на первый 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 ().