monawenka 0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 5 |
||||
1 |
||||
Как реализовать класс на форме18.09.2015, 11:19. Показов 3135. Ответов 1 Метки нет (Все метки)
Можете помочь!есть класс и не понимаю как его реализовать на форме…Может кто объяснить или кинуть код как будет выглядеть на форме?
__________________
0 |
Zhavoronkov5 52 / 48 / 23 Регистрация: 27.07.2015 Сообщений: 144 |
||||
18.09.2015, 22:41 |
2 |
|||
1. В следующих сообщениях проставляйте теги. Дальше создаете WindowsFormApplication. Либо добавляйте класс отдельным файлом *.cs, либо в файл с формой, если он небольшой. Дальше в коде формы создавайте экземпляр класса, и с ним уже работаете.
1 |
Практическое занятие № 20. Создание классов
1 Цель занятия
Получить практические навыки создания классов в приложении Windows Forms
2 Перечень оборудования и программного обеспечения
Персональный компьютер
Microsoft Office (Word)
Microsoft Visual Studio
3 Краткие теоретические сведения
Классы и объекты
Класс является основой для создания объектов. Объекты являются экземплярами класса.
При определении класса объявляются данные, которые он содержит, и код (методы), работающие с этими данными. Данные и методы, составляющие класс, называются членами класса. Данные содержатся в переменных экземпляра, которые определены классом, а код содержится в методах. В С# определены несколько специфических разновидностей членов класса. Это — переменные экземпляра, статические переменные, константы, методы, конструкторы, деструкторы, индексаторы, события, операторы и свойства.
Непосредственно инициализация данных в объекте (переменных экземпляра) происходит в конструкторе. В классе могут быть определены несколько конструкторов.
Синтаксис класса:
class имя_класса{
тип_доступа тип имя_переменной1;
тип_доступа тип имя_переменной2;
…
тип_доступа возвращаемый_тип
имя_метода1(список_параметров) {тело_метода}
}
где тип_доступа может быть public, private, protected, internal.
Члены класса с типом доступа public доступны везде за пределами данного класса, с типом доступа protected – внутри членов данного класса и производных, с типом доступа private — только для других членов данного класса. Тип доступа internal применяется для типов, доступных в пределах одной сборки.
Пример 1:
class Animal
{
public string Name;
private double Weight;
protected string Type;
public void Animal(double W, string T, string N)
{
Weight = W;
Type = T;
Name = N;
}
public int GetWeight() { return Weight; }
}
Создание объекта
имя_класса имя_объекта = new имя_класса();
При создании объекта класса происходит вызов соответствующего конструктора класса.
Конструктор и деструктор
Конструктор класса – метод для инициализации объекта при его создании. Он имеет то же имя, что и его класс. В конструкторах тип возвращаемого значения не указывается явно. Конструкторы используются для присваивания начальных значений переменным экземпляра, определенным классом, и для выполнения любых других процедур инициализации, необходимых для создания объекта. Все классы имеют конструкторы независимо от того, определен он или нет. По умолчанию в С# предусмотрено наличие конструктора, который присваивает нулевые значения всем переменным экземпляра (для переменных обычных типов) и значения null (для переменных ссылочного типа). Но если конструктор явно определен в классе, то конструктор по умолчанию использоваться не будет.
имя_класса(список_параметров) {тело_конструктора}
Деструктор – метод, вызывающийся автоматически при уничтожении объекта класса (непосредственно перед “сборкой мусора”). Деструктор не имеет параметров и возвращаемого значения.
~имя_класса() {тело_деструктора}
Пример 2. Создание класса «Животное» с полями: название, вес и прежний вес.
Решение.
Форма Windows-приложения с элементами, позволяющими отображать и обрабатывать значения полей заданного класса:
Описание созданного класса (после класса Form1):
Метод button1_Click() класса Form0, осуществляющий обращение к методам созданного класса:
4 Порядок выполнения работы
4.1 Изучить теоретические сведения и задание к работе.
4.2 В соответствии с вариантом задания создать класс с необходимыми данными (полями) и методами.
4.3 Создать метод обработки данных, осуществляющий обращение к методам созданного класса.
5 Содержание отчета
5.1 Название работы
5.2 Цель работы
5.3 Листинг и скрины отлаженной программы в соответствии с вариантом задания
6 Варианты заданий
6.1 Класс «Квадрат» с полями: центр квадрата и его сторона.
6.2 Класс «Время» с полями: часы, минуты и секунды.
6.3 Класс «Прямоугольник» с полями: верхняя левая и правая нижняя точки.
6.4 Класс «Конус» с полями: радиус окружности основания и высота.
6.5 Класс «Куб» с полями: координаты центра и сторона.
6.6 Класс «Компьютер» с полями: тактовая частота процессора, объем ОЗУ, емкость диска.
6.7 Класс «Служащий» с полями: табельный номер, номер подразделения и оклад.
6.8 Класс «Накладная» с полями: номер, дата отпуска и сумма.
6.9 Класс «Проект» с полями: номер проекта, сумма, дата исполнения.
6.10 Класс «Здание» с полями: количество этажей, подъездов и квартир на этаже.
6.11 Класс «Студент» с полями: ФИО, номер группы, номер зачетки.
6.12 Класс «Дата» с полями: число, номер месяца и две последние цифры года.
6.13 Класс «Вектор на плоскости» с данными проекция вектора на оси X и Y.
6.14 Класс «Окружность» с полями: центр и радиус окружности.
6.15 Класс «Дробь» с полями: числитель и знаменатель.
7 Используемая литература
7.1 Г. Гагарина, Е. В. Кокорева, Б. Д. Виснадул Технология разработки программного обеспечения. Форум, Инфра-М, 2009
7.2 Эндрю Троелсен Язык программирования С# 2010 и платформа .NET 4.0, М., ВИЛЬЯМС, 2011
7.3 А. Марченко C#. Введение в программирование, М, Вильямс, 2009
7.4 http://msdn.microsoft.com/ru-ru/library/67ef8sbd.aspx.
Работа с формами
Основы форм
Последнее обновление: 31.10.2015
Внешний вид приложения является нам преимущественно через формы. Формы являются основными строительными блоками. Они предоставляют
контейнер для различных элементов управления. А механизм событий позволяет элементам формы отзываться на ввод пользователя, и, таким образом,
взаимодействовать с пользователем.
При открытии проекта в Visual Studio в графическом редакторе мы можем увидеть визуальную часть формы — ту часть, которую мы видим после запуска приложения и куда мы переносим
элементы с панели управления. Но на самом деле форма скрывает мощный функционал, состоящий из методов, свойств, событий и прочее. Рассмотрим
основные свойства форм.
Если мы запустим приложение, то нам отобразится одна пустая форма. Однако даже такой простой проект с пустой формой имеет несколько компонентов:
Несмотря на то, что мы видим только форму, но стартовой точкой входа в графическое приложение является класс Program, расположенный в
файле Program.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }
Сначала программой запускается данный класс, затем с помощью выражения Application.Run(new Form1())
он запускает форму
Form1. Если вдруг мы захотим изменить стартовую форму в приложении на какую-нибудь другую, то нам надо изменить в этом выражении Form1 на соответствующий
класс формы.
Сама форма сложна по содержанию. Она делится на ряд компонентов. Так, в структуре проекта есть файл Form1.Designer.cs, который выглядит
примерно так:
namespace HelloApp { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.SuspendLayout(); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Name = "Form1"; this.Text = "Привет мир!"; this.ResumeLayout(false); } #endregion } }
Здесь объявляется частичный класс формы Form1, которая имеет два метода: Dispose()
, который выполняет роль деструктора объекта, и
InitializeComponent()
, который устанавливает начальные значения свойств формы.
При добавлении элементов управления, например, кнопок, их описание также добавляется в этот файл.
Но на практике мы редко будем сталкиваться с этим классом, так как они выполняет в основном дизайнерские функции — установка свойств объектов, установка переменных.
Еще один файл — Form1.resx — хранит ресурсы формы. Как правило, ресурсы используются для создания однообразных форм сразу для
нескольких языковых культур.
И более важный файл — Form1.cs, который в структуре проекта называется просто Form1, содержит код или программную логику формы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } }
По умолчанию здесь есть только конструктор формы, в котором просто вызывается метод InitializeComponent()
, объявленный в файле дизайнера
Form1.Designer.cs. Именно с этим файлом мы и будем больше работать.
Приложения Windows Forms
Если вы захотите писать программы, похожие на привычные приложения Windows, то наверняка воспользуетесь классами из пространства имен System.Windows.Forms. Они позволяют задействовать кнопки, списки, текстовые поля, меню, окна сообщений и множество других «элементов управления». Элементы управления — это то, что вы помещаете в форму. Они нужны для вывода информации, например, текстовой (элемент управления Label ) или графической (элемент управления PictureBox ), либо для выполнения определенных действий, например, выбора значения или перехода к другой форме после нажатия кнопки. Все элементы управления помещаются на форму.
Понятие «форма», принятое в программировании, родственно понятию «форма анкеты» или «форма документа» из обычной жизни. На форме можно в определенном порядке расположить различные элементы (текст, картинки, поля для заполнения и т. д.). Когда нам дают готовую форму документа и просят ее заполнить, мы обычно читаем содержащуюся в ней типовую информацию, а затем вписываем недостающие данные в определенные строки.
В программировании понятие формы во многом похоже: форма позволяет размещать текст, изображения, поля ввода, кнопки и т. п., добиваясь их точного расположения на экране. В консольном приложении на экран выводятся только строки текста.
Компания Майкрософт предоставила в составе библиотеки классов .NET Framework огромное количество «элементов управления», которые можно помещать на формы. Освоив этот инструмент, вы сможете быстро создавать эффектные приложения.
Некоторые полезные классы из пространства имен System.Windows.Forms
Вот некоторые элементы управления, которые можно размещать на формах:
- Label (Надпись).
- Button (Кнопка).
- ListBox (Список).
- CheckBox (Флажок).
- RadioButton (Переключатель).
- MessageBox (Окно сообщений).
- Menu (Меню).
- TabControl (Управление вкладками).
- Toolbar (Панель инструментов).
- TreeView (Дерево).
- DataGrid (Сетка данных).
- PictureBox (Изображение).
- RichTextBox (Текстовое поле с поддержкой формата RTF).
Работа с примерами программ Windows Forms в Visual C# Express
Возможно, вы предпочтете не использовать уже заготовленные примеры проектов, а разрабатывать их «с нуля». В таком случае нужно учесть, что для каждого проекта C# Express сразу же создает два файла (с именами Form1.cs и Program.cs ) и наполняет их исходным кодом на языке C#, то есть вы изначально получаете простейшую, но полноценную программу. Предлагаемый нами способ работы с уже полученным проектом состоит в выполнении следующих действий:
- Удалите файл Form1.cs.
- Замените код в файле Program.cs на код примера, с которым вы работаете.
Оба этих действия не понадобятся, если вы открываете программы с помощью команды «Открыть проект» в меню «Файл» и находите нужный проект в той папке, куда его поместили после разархивации.
Пример программы 3.3
Рассмотрим пример простейшего приложения Windows Forms. Оно всего лишь создает новую форму и выводит определенный текст в заголовок окна формы.
using System.Windows.Forms; class SimpleWindowsForm : Form { // Метод-конструктор нашего класса public SimpleWindowsForm() { // Указываем заголовок окна this.Text = "Это простая форма с заголовком"; } static void Main() { // Создаем новый экземпляр класса //и запускаем его на выполнение // В результате на экране дисплея откроется форма Application.Run(new SimpleWindowsForm()); } }
Листинг
3.3.
Пример программы 3.4
Следующий пример тоже достаточно прост, но мы делаем шаг вперед — размещаем на форме кнопку.
using System.Windows.Forms; class SimpleWindowsFormWithButton : Form { Button button1; // Метод-конструктор нашего класса public SimpleWindowsFormWithButton() { // Указываем заголовок окна this.Text = "Форма с командной кнопкой"; // Добавляем кнопку в коллекцию элементов управления формы // Хотя на кнопке написано: "Нажми меня!", // пока при нажатии ничего не происходит! button1 = new Button(); button1.Text = "Нажми меня!"; button1.Top = 100; button1.Left = 100; button1.Height = 50; button1.Width = 70; this.Controls.Add(button1); } static void Main() { // Создаем и запускаем форму Application.Run(new SimpleWindowsFormWithButton()); } }
Листинг
3.4.
Пример программы 3.5
Кнопку на форму мы поместили, но при нажатии на нее ничего не происходит. Это скучно.
Нам нужно описать метод, который будет выполнять какое-либо действие при нажатии на кнопку. Пусть при этом текст в заголовке окна будет меняться. Поскольку такой метод отслеживает наступление некоторого события (в нашем случае – нажатие на кнопку) и затем каким-то образом обрабатывает его, он, напомним, называется «обработчик события». Кроме того, надо привязать обработчик события к соответствующему событию, то есть к нажатию на кнопку.
using System; using System.Windows.Forms; using System.Drawing; class FormWithWorkingButton : Form { Button mrButton; // Метод-конструктор нашего класса public FormWithWorkingButton() { // Указываем заголовок окна this.Text = "Форма с работающей кнопкой!"; // Добавляем кнопку и привязываем ее к обработчику события mrButton = new Button(); mrButton.Text = "Нажми меня"; mrButton.Top = 100; mrButton.Left = 100; mrButton.Height = 50; mrButton.Width = 70; mrButton.Click += new System.EventHandler(mrButton_Click); this.Controls.Add(mrButton); } static void Main() { // Создаем и запускаем форму Application.Run(new FormWithWorkingButton()); } // Обработчик события, срабатывающий при нажатии кнопки void mrButton_Click(object sender, EventArgs e) { // Изменяем текст mrButton.Text = "Кнопка была нажата!"; } }
Листинг
3.5.
Пример программы 3.6
Мы добились успеха: наша программа умеет выполнять основные действия. Теперь добавим на форму несколько новых элементов управления, аккуратно разместим их и немного поработаем с ними. Возьмем элементы управления 4-х типов: Button, ListBox, MessageBox и PictureBox.
Обратите внимание: кроме System.Windows.Forms в этом примере упоминается пространство имен System.Drawing. Дело в том, что мы используем элемент управления PictureBox, а для работы с изображениями требуются классы Drawing.
using System.Windows.Forms; using System.Drawing; class MyForm : Form { // Объявим элемент ListBox как поле класса: // нам придется обращаться к нему из разных методов ListBox listBox1; // Метод-конструктор нашего класса public MyForm() { //Размеры формы this.Size = new Size(400, 400); // Создадим элемент PictureBox, поместим в него изображение, // добавим его на форму PictureBox pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; Bitmap image1 = new Bitmap ("..//..//images//Zakat.jpg"); pictureBox1.ClientSize = new Size(this.Width, 150); pictureBox1.Image = (Image)image1; this.Controls.Add(pictureBox1); // Создаем объект Button, определяем некоторые из его свойств Button button1 = new System.Windows.Forms.Button(); button1.Location = new Point(150, 160); button1.Size = new Size(100, 30); button1.Text = "Нажми меня"; button1.Click += new System.EventHandler(button1_Click); this.Controls.Add(button1); // Создаем ListBox, определяем свойства и добавляем на форму listBox1 = new System.Windows.Forms.ListBox(); listBox1.Location = new System.Drawing.Point(20, 200); listBox1.Size = new Size(100, 100); listBox1.Items.Add("Лес"); listBox1.Items.Add("Степь "); listBox1.Items.Add("Озеро"); listBox1.Items.Add("Море"); listBox1.Items.Add("Океан"); listBox1.SelectedIndex = 2; this.Controls.Add(listBox1); } // Обработчик события, срабатывающий при нажатии кнопки void button1_Click(object sender, System.EventArgs e) { // Выводим сообщение с указанием выбранного в списке пункта MessageBox.Show(this, "Вы выбрали " + listBox1.SelectedItem, "Уведомление", MessageBoxButtons.OK); } static void Main() { // Создаем и запускаем форму Application.Run(new MyForm()); } private void InitializeComponent() { this.SuspendLayout(); // // MyForm // this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(292, 273); this.Name = "MyForm"; this.ResumeLayout(false); } }
Листинг
3.6.
Содержание
- Условие задачи
- Математическая постановка задачи
- Выполнение
- 1. Создание нового проекта.
- 2. Размещение элементов управления на форме.
- 3. Настройка свойств элементов управления.
- 4. Классы, необходимые для решения задачи.
- 5. Реализация конструкторов класса Point.
- 6. Реализация конструкторов класса Circle.
- 7. Реализация методов класса Point.
- 8. Реализация методов класса Circle.
- 9. Примеры использования конструкторов и методов классов Point и Circle.
- 10. Предварительный исходный код классов.
- 11. Реализация свойств класса Point.
- 12. Реализация свойств класса Circle.
- 13. Реализация методов интерфейса ICloneable в классах.
- 14. Реализация методов интерфейса IEquatable.
- 15. Реализация метода вычисления площади круга в классе Circle.
- 16. Сокращенный листинг класса Point.
- 17. Сокращенный листинг класса Circle.
- 18. Программирование обработчика события клика на кнопке «Вычислить«.
- Связанные темы
Поиск на других ресурсах:
Условие задачи
В разработанных классах необходимо реализовать такие концепции ООП как «наследование» и «полиморфизм«.
Нужно описать базовый класс (класс-предок) и унаследовать (наследовать) от него. Часть функциональности классов нужно реализовать с использованием свойств.
Каждый класс должен содержать реализацию по крайней мере:
- двух конструкторов;
- двух методов;
- двух свойств;
- двух интерфейсов.
Необходимо переопределить операции над объектами классов. Создать класс, который определяет окружность на плоскости. Используя разработанные классы найти площадь круга.
Реализовать интерфейсы ICloneable, IEquatable.
⇑
Математическая постановка задачи
На рисунке 1 изображена окружность на плоскости.
Рис. 1. Изображение окружности на плоскости
Как видно из рисунка 1, для обозначения окружности на плоскости нужно иметь:
- координаты (x, y) точки середины окружности;
- радиус окружности R.
Площадь окружности исчисляется по формуле:
где S — площадь окружности; R — радиус окружности; π– константа, которая равняется 3.1415.
⇑
Выполнение
1. Создание нового проекта.
Запустить Microsoft Visual Studio. Создать новый проект как Windows Forms Application. Пример создания нового проекта приведен здесь.
Автоматически будет создана новая форма приложения.
⇑
2. Размещение элементов управления на форме.
Разместить на форме следующие элементы управления (рисунок 2):
- два элемента управления типа Label. Автоматически будут созданы объекты с именами label1 и label2;
- элемент управления типа TextBox. Создается новый объект с именем textBox1;
- элемент управления типа Button. Создается объект с именем button1.
Рис. 2. Размещение элементов управления на форме
⇑
3. Настройка свойств элементов управления.
Настроить следующие свойства элементов управления (рисунок 3):
- в элементе управления label1 свойство Text = «R = «;
- в элементе управления label2 свойство Text = «S = «;
- в элементе управления button1 свойство Text = «Вычислить«;
- в элементе управления Form1 свойство Text = «Площадь круга«.
Рис. 3. Форма приложения после настройки элементов управления
После настройки формы нужно заняться созданием классов.
⇑
4. Классы, необходимые для решения задачи.
В соответствии с условием задачи, нужно создать два класса:
- класс Point, отображающий точку на плоскости. Этот класс должен быть базовым;
- класс Circle, отображающий круг. Этот класс должен унаследовать данные и методы класса Point (в соответствии с условием задачи).
В данной задаче класс Point называется базовым, а класс Circle – производным.
Итак, возникает иерархия с 2-х классов. Схема иерархии классов и отображение данных (полей) в классах изображенная на рисунке 4.
Рис. 4. Иерархия классов в соответствии с условием задачи
По ходу решения задачи в классы будут вноситься изменения: свойства и методы.
Опишем класс Point, содержащий только данные. На языке C# листинг класса Point будет следующий:
class Point { // поля класса объявлены как protected protected float x; // координата x точки protected float y; // координата y точки }
В классе Point данные класса описываются как protected. Это означает, что эти данные есть видимыми в производных классах и невидимыми извне (скрытые для доступа через объект класса).
Для доступа к данным будут использоваться свойства и специальные методы.
Таким же образом создается класс Circle. Пока что листинг класса Circle следующий:
class Circle:Point // наследует данные из класса Point { // поля класса private float R; // радиус окружности }
В описании класса Circle, начало строки
class Circle:Point
означает, что класс Circle наследует данные и методы класса Point.
Таким образом, на данный момент, в классе Circle есть доступными три поля:
- поле x из унаследованного класса Point;
- поле y из унаследованного класса Point;
- поле R, которое есть внутренним полем класса Circle.
⇑
5. Реализация конструкторов класса Point.
В соответствии с условием задачи, каждый из классов должен содержать минимум два конструктора.
Последовательно в текст класса Point нужно добавить два конструктора. Первый конструктор без параметров инициализирует данные нулевыми значениями.
Второй конструктор – параметризованный. Этот конструктор получает входящими 2 параметра и устанавливает новые значения для внутренних переменных x и y.
Ниже приведен текст программного кода обоих конструкторов:
// конструктор 1 - без параметров public Point() { x = 0f; // обнуление значений координат y = 0f; } // конструктор 2 - с двумя параметрами public Point(float nx, float ny) { x = nx; y = ny; }
Следует обратить внимание, что конструкторы имеют тип доступа public, так как они вызываются извне при создании объекта класса.
⇑
6. Реализация конструкторов класса Circle.
Таким же образом нужно добавить два конструктора в класс Circle.
// конструктор 1 - инициализирует поля нулевыми значениями public Circle() { x = 0f; // 0f - означает, что это значение имеет тип float y = 0f; R = 0f; } // конструктор 2 - с тремя параметрами public Circle(float nx, float ny, float nR) { x = nx; y = ny; R = nR; }
⇑
7. Реализация методов класса Point.
В соответствии с условием задачи, в каждом классе должны быть реализованы два метода. Реализуем методы, которые выполняют следующие действия:
- метод GetPoint(), возвращающий точку типа Point;
- метод SetXY(), устанавливающий новые значения внутренних переменных класса Point.
Тип доступа для методов выбран как public.
Листинг методов следующий.
public Point GetPoint() { Point p; // описывается переменная (объект), для которой память еще не выделена p = new Point(x,y); // выделяется память, создается новый экземпляр класса return p; } // метод, который устанавливает новые значения внутренних переменных public void SetXY(float nx, float ny) { x = nx; y = ny; }
⇑
8. Реализация методов класса Circle.
Подобным образом создаются методы класса Circle. В классе Circle реализуются два метода. Первый метод GetCircle() возвращает объект (с выделением памяти) типа Circle.
Второй метод SetXYR() устанавливает новые значения внутренних переменных. Этот метод получает входными 3 параметра (координаты x, y и радиус R окружности). В методе продемонстрировано использование ключевого слова this для доступа к полям класса. В этом случае имена локальных переменных-параметров совпадают с именами полей класса и скрывают их видимость внутри метода.
Листинг методов следующий:
// методы класса Circle в соответствии с условием задачи // метод, который получает новый экземпляр класса типа Circle public Circle GetCircle() { Circle c; c = new Circle(x, y, R); return c; } // метод, который устанавливает новые значения во внутренние поля класса Circle public void SetXYR(float x, float y, float R) { // пример использования ключевого слова this // во внутреннюю переменную x класса заносится значение локальной переменной x метода SetXYR() this.x = x; // так же заполняются внутренние переменные y и R класса Circle this.y = y; this.R = R; }
⇑
9. Примеры использования конструкторов и методов классов Point и Circle.
Приведем несколько примеров использования конструкторов и методов классов Point и Circle.
Демонстрация методов GetPoint() и SetXY():
// класс Point // вызов конструктора без параметров класса Point() Point p = new Point(); Point p1 = null, p2 = null; p1 = new Point(4.5f, 3.2f); // вызов конструктора с двумя параметрами p2 = p1.GetPoint(); p2.SetXY(3.3f, -2.8f); // установить новые значения // класс Circle Circle c = new Circle(); // конструктор без параметров Circle c1, c2; c1 = new Circle(3.3f, -2.8f, 12f); // выделение памяти c2 = c1.GetCircle(); // метод GetCircle() c2.SetXYR(3.8f, -1.9f, 8f); // метод SetXYR()
⇑
10. Исходный код классов.
На данный момент классы Point и Circle имеют следующий вид:
// описание класса Point class Point { // поля класса объявлены как protected protected float x; // координата x точки protected float y; // координата y точки // конструктор 1 - без параметров public Point() { x = 0f; y = 0f; } // конструктор 2 - с двумя параметрами public Point(float nx, float ny) { x = nx; y = ny; } public Point GetPoint() { Point p; // описывается переменная (объект), для которой память еще не выделена p = new Point(x,y); // выделяется память, создается новый экземпляр класса return p; } // метод, который устанавливает новые значения внутренних переменных public void SetXY(float nx, float ny) { x = nx; y = ny; } } // описание класса Circle class Circle:Point // наследует данные класса Point { // поля класса private float R; // радиус окружности // конструктор 1 - инициализирует поля нулевыми значениями public Circle() { x = 0f; y = 0f; R = 0f; } // конструктор 2 - с тремя параметрами public Circle(float nx, float ny, float nR) { x = nx; y = ny; R = nR; } // методы класса Circle в соответствии с условием задачи // метод, который получает новый экземпляр класса типа Circle public Circle GetCircle() { Circle c; // создается новый объект типа класс Circle c = new Circle(x, y, R); // выделяется память для объекта c, создается экземпляр класса return c; } // метод, который устанавливает новые значения во внутренние поля класса Circle public void SetXYR(float x, float y, float R) { // пример использования ключевого слова this this.x = x; // во внутреннюю переменную x класса заносится значение локальной переменной x метода SetXYR() this.y = y; // так же заполняются внутренние переменные y и R класса Circle this.R = R; } }
⇑
11. Реализация свойств класса Point.
Следующим шагом нужно создать два свойства класса Point.
Первое свойство возвращает или устанавливает значение координат точки x. Второе свойство возвращает/устанавливает значение координаты y.
Имя первого свойства XX. Имя второго свойства YY.
Листинг свойств XX и YY следующий:
// свойство, которое возвращает/устанавливает координату x public float XX { get { return x; } set { x = value; } } // свойство, которое возвращает/устанавливает координату y public float YY { get { return y; } set { y = value; } }
После такого описания свойства XX и YY можно использовать. Далее приведен пример использования свойств XX и YY.
... Point p = new Point(5.2f, 6.35f); // создание объекта типа Point float x,y; x = p.XX; // x = 5.2 y = p.YY; // y = 6.35 // переопределить значения p.XX = 2.33f; p.YY = -3.8f; x = p.XX; // x = 2.33 y = p.YY; // y = -3.8 ...
⇑
12. Реализация свойств класса Circle.
Аналогичным образом описываются свойства класса Circle. Первое свойство читает/устанавливает значение радиуса R. Второе свойство читает/устанавливает значение точки, которая есть центром кола (класс Point).
// свойства класса Circle // свойство, которое возвращает значение радиуса окружности R public float RR { get { return R; } set { R = value; } } // свойство, которое возвращает значение точки типа Point, которая есть центром окружности public Point PP { get { Point p; p = new Point(x, y); return p; } set { x = value.XX; y = value.YY; } }
В нижеследующем листинге описывается пример использования свойств PP и RR.
// создание объекта, в котором значение полей x = 5.5; y = -2.3; R = 12.8 Circle c = new Circle(5.5f, -2.3f, 12.8f); float x, y, R; // доступ к свойству PP класса Circle x = c.PP.XX; // x = 5.5 y = c.PP.YY; // y = -2.3 // доступ к свойству RR R = c.RR; // R = 12.8 c.RR = -20.85f;
⇑
13. Реализация методов интерфейса ICloneable в классах.
Если реализовать интерфейс ICloneable, то можно обеспечить глубокое копирование объектов.
В нижеследующем примере осуществляется поверхностное копирование объектов:
Point p1 = new Point(5.3f, -6.8f); Point p2; // поверхностное копирование p2 = p1; // оба объекта указывают на один участок памяти
Интерфейс ICloneable представляет один метод для реализации. Этот метод называется Clone(). Этот метод нужно реализовать в классах Point и Circle. Реализация метода работает по одинаковому принципу.
Прежде всего нужно изменить заголовок класса Point. Вместо текста
class Point
нужно набрать
class Point:ICloneable
Это означает, что в классе Point нужно реализовать единственный метод Clone(). Листинг метода следующий:
// реализация метода Clone() в интерфейсе ICloneable public object Clone() { Point p = new Point(x, y); return p; }
Так как класс Circle наследует класс Point, который наследует интерфейс ICloneable, то в классе Circle также можно реализовать метод Clone() (но не обязательно).
// Реализация интерфейса ICloneable в классе Circle public object Clone() { Circle c = new Circle(); return c; }
Пример использования метода Clone().
Point p1 = new Point(5.2f, 6.35f); // создание объекта Point p2; // глубокое копирование, так как реализован метод Clone() p2 = (Point)p1.Clone();// для p2 отдельно выделяется память // класс Circle Circle c1 = new Circle(3.2f, -8.3f, 11f); Circle c2 = null; c2 = (Circle)c1.Clone(); // для c2 отдельно выделяется оперативная память
⇑
14. Реализация методов интерфейса IEquatable.
Интерфейс IEquatable реализуется в тех классах, где нужно определить порядок сравнения двух объектов на равенство их значений. В этом интерфейсе определяется только один метод Equals(). Этот метод возвращает значение true, если значение вызывающего объекта есть равным значению другого объекта, который является параметром в методе Equals().
Для класса Point реализуем метод Equals(), который сравнивает на равенство значения переменных x и y.
Листинг метода Equals() для класса Point следующий:
// реализация метода Equals() из интерфейса IEquatable public bool Equals(Point p2) { if ((this.x == p2.x) && (this.y == p2.y)) return true; else return false; }
Листинг метода Equals() для класса Circle следующий:
// Реализация метода Equals() из интерфейса IEquatable public bool Equals(Circle c2) { if ((this.x == c2.x) && (this.y == c2.y) && (this.R == c2.R)) return true; else return false; }
В программе метод Equals() для классов можно использовать следующим образом:
// демонстрация метода Equals() для класса Point Point p1 = new Point(3f, -5.5f); Point p2; bool f; p2 = (Point)p1.Clone(); f = p1.Equals(p2); // f = true // демонстрация метода Equals() для класса Circle Circle c1 = new Circle(3.2f, -8.3f, 11f); Circle c2 = new Circle(3.2f, -8.3f, 11f); f = c1.Equals(c2); // f = true
⇑
15. Реализация метода вычисления площади круга в классе Circle.
Название метода – GetSquare(). Для вычисления площади круга нужно иметь только радиус R. Радиус получается с внутренней переменной R. Результат вычисления есть тип float.
В тексте класса Circle нужно добавить следующий метод:
// Метод, который вычисляет площадь круга public float GetSquare() { const float pi = 3.1415f; float s; s = pi * R * R; return s; }
⇑
16. Сокращенный листинг класса Point.
Итак, создание классов завершено.
Сокращенный листинг класса Point следующий (детали реализации описываются в предыдущих пунктах):
class Point:ICloneable,IEquatable<Point> { // поля класса объявленные как protected protected float x; // координата x точки protected float y; // координата y точки // конструктор 1 - без параметров public Point() { ... } // конструктор 2 - с двумя параметрами public Point(float nx, float ny) { ... } // метод, который возвращает точку с координатами public Point GetPoint() { ... } // метод, который устанавливает новые значения внутренних переменных public void SetXY(float nx, float ny) { ... } // свойство, которое возвращает/устанавливает координату x public float XX { get { ... } set { ... } } // свойство, которое возвращает/устанавливает координату y public float YY { get { ... } set { ... } } // реализация метода Clone() в интерфейсе ICloneable public object Clone() { ... } // реализация метода Equals() из интерфейса IEquatable public bool Equals(Point p2) { ... } }
⇑
17. Сокращенный листинг класса Circle.
Низшее приведен листинг класса Circle, в котором скрыты детали реализации. Реализация методов, свойств, конструкторов описывается в предыдущих пунктах.
class Circle:Point // наследует данные класса Point { // поля класса private float R; // радиус окружности // конструктор 1 - инициализирует поля нулевыми значениями public Circle() { ... } // конструктор 2 - с тремя параметрами public Circle(float nx, float ny, float nR) { ... } // методы класса Circle в соответствии с условием задачи // метод, который получает новый экземпляр класса типа Circle public Circle GetCircle() { ... } // метод, который устанавливает новые значения во внутренние поля класса Circle public void SetXYR(float x, float y, float R) { ... } // свойства класса Circle // свойство, которое возвращает значение радиуса окружности R public float RR { get { ... } set { ... } } // свойство, которое возвращает значение точки типа Point, которая есть центром окружности public Point PP { get { ... } set { ... } } // Реализация интерфейса ICloneable public object Clone() { ... } // Реализация метода Equals() из интерфейса IEquatable public bool Equals(Circle c2) { ... } // Метод, который вычисляет площадь круга public float GetSquare() { ... } }
⇑
18. Программирование обработчика события клика на кнопке «Вычислить«.
Вычисление площади круга осуществляется в момент, когда пользователь сделает клик на кнопке «Вычислить«. Листинг обработчика события клика на кнопке «Вычислить» следующий:
private void button1_Click(object sender, EventArgs e) { Circle c = new Circle(); float s; // заполнить значения R c.RR = (float)Double.Parse(textBox1.Text); // вызвать метод определения площади круга s = c.GetSquare(); label2.Text = "S = " + s.ToString(); }
Результат работы программы изображен на рисунке 5.
Рис. 5. Выполнение программы
⇑
Связанные темы
-
Интерфейсы. Использование интерфейсов в программах на C#
⇑
Содержание |
|
Windows Forms — фреймворк для работы с формами.
Общая структура программы[править]
Любая программа, использующая Wondows Forms может иметь следующий вид:
{$apptype windows} {$reference 'System.Windows.Forms.dll'} {$reference 'System.Drawing.dll'} uses System.Windows.Forms, System.Drawing; var MainForm: System.Windows.Forms.Form; begin MainForm := new Form; Application.Run(MainForm); end.
MainForm — главная форма.
Основные классы[править]
Windows Forms содержит следующие классы:
- System.Windows.Forms.Button или Button (кнопка)
- System.Windows.Forms.Label или Label (метка)
- System.Windows.Forms.CheckBox или CheckBox (флажок)
- System.Windows.Forms.RadioButton или RadioButton (радио-кнопка)
- System.Windows.Forms.TrackBar или TrackBar (ползунок)
- System.Windows.Forms.ListBox или ListBox (список)
- System.Windows.Forms.ComboBox или ComboBox (выпадающий список)
- System.Windows.Forms.Form или Form (форма)
- System.Windows.Forms.GroupBox или GroupBox (фрейм)
- System.Windows.Forms.SplitContainer или SplitContainer (элемент разделения окна)
- System.Windows.Forms.MenuStrip или MenuStrip (главное меню)
- System.Windows.Forms.ToolStripMenuItem или ToolStripMenuItem (подменю)
Button[править]
System.Windows.Forms.Button — класс кнопки. Синтаксис ее создания:
name — имя кнопки.
Свойство | Значение |
---|---|
Width | Ширина кнопки. |
Height | Высота кнопки. |
Text | Текст на кнопке. |
BackColor | Цвет фона кнопки. |
ForeColor | Цвет текста кнопки. |
Location | Позиция кнопки на форме.
В качестве значения должна быть точка System.Drawing.Point. |
AutoSize | Будет ли меняться размер кнопки, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на кнопке. |
Parent | Родительский виджет. |
Visible | Видна ли кнопка. |
Событие | Значение |
---|---|
Click | Хранит ссылку на процедуру, которая выполниться при нажатии на кнопку.
Для установки его значения используйте вместо := +=. |
Label[править]
System.Windows.Forms.Label — класс метки. Синтаксис ее создания:
name — имя метки.
Свойство | Значение |
---|---|
Width | Ширина метки. |
Height | Высота метки. |
Text | Текст на метки. |
BackColor | Цвет фона метки. |
ForeColor | Цвет текста метки. |
Location | Позиция метки на форме. |
AutoSize | Будет ли меняться размер метки, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на метке. |
Parent | Родительский виджет. |
Visible | Видна ли метка. |
CheckBox[править]
System.Windows.Forms.CheckBox — класс флажка. Синтаксис его создания:
name — имя флажка.
Свойство | Значение |
---|---|
Width | Ширина флажка. |
Height | Высота флажка. |
Text | Текст на флажка. |
BackColor | Цвет фона флажка. |
ForeColor | Цвет текста флажка. |
Location | Позиция флажка форме. |
AutoSize | Будет ли меняться размер флажка, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на флажка. |
Parent | Родительский виджет. |
Visible | Виден ли флажок. |
Checked | Определяет установлен ли флажок или нет. |
RadioBox[править]
System.Windows.Forms.RadioBox- класс радио-кнопки. Синтаксис ее создания:
name — имя радио-кнопки.
Свойство | Значение |
---|---|
Width | Ширина радио-кнопки. |
Height | Высота радио-кнопки. |
Text | Текст на радио-кнопки. |
BackColor | Цвет фона радио-кнопки. |
ForeColor | Цвет текста радио-кнопки. |
Location | Позиция радио-кнопки форме. |
AutoSize | Будет ли меняться размер радио-кнопки, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на радио-кнопке. |
Parent | Родительский виджет. |
Visible | Видна ли радио-кнопка. |
Checked | Определяет установлена ли радио-кнопка или нет. |
TrackBar[править]
System.Windows.Forms.TrackBar — класс ползунка. Синтаксис его создания:
name — имя ползунка.
Свойство | Значение |
---|---|
Width | Ширина ползунка. |
Height | Ширина ползунка. |
Location | Позиция ползунка на форме. |
Parent | Родительский виджет. |
Visible | Виден ли ползунок. |
Minimum | Минимальное значение ползунка. |
Maximum | Максимальное значение ползунка. |
Value | Текущее значение ползунка. |
Orientation | Ориентация ползунка.
|
TickStyle | Контролирует как отображаются деления.
|
TickFrequency | Расстояние между делениями. |
ListBox[править]
System.Windows.Forms.ListBox- класс списка. Синтаксис его создания:
name — имя списка.
Свойство | Значение |
---|---|
Width | Ширина списка. |
Height | Высота списка. |
Location | Позиция списка на форме. |
Parent | Родительский виджет. |
Visible | Виден ли список. |
ItemHeight | Высота элемента списка. |
Items.Count | Количество элементов списка. |
Items.Item[k] | K-ый элемент списка. |
IntegralHeight | Указывает будет ли подгоняться размер списка под размер элементов, чтобы был видны названия всех элементов полностью. |
Событие | Описание |
---|---|
Click | Хранит ссылку на процедуру, которая выполнится при щелчке по списку. |
SelectedIndexChanged | Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента списка. |
Ниже a — список.
Процедура | Значение |
---|---|
a.Items.Add(t) | Добавляет в список элемент с текстом t. |
a.Items.Clear | Очищает список. |
ComboBox[править]
System.Windows.Forms.ComboBox — класс выпадающего списка. Для его создания пишите:
name — имя выпадающего списка.
Свойство | Значение |
---|---|
Width | Ширина выпадающего списка. |
Height | Высота выпадающего списка. |
Parent | Родительский виджет. |
Visible | Виден ли выпадающий список. |
Count | Количество элементов в выпадающем списке. |
SelectedIndex | Индекс выбранного элемента выпадающего списка. |
SelectedItem | Выбранный элемент выпадающего списка. |
Items.Item[k] | K-ый элемент выпадающего списка. |
IntegralHeight | Указывает будет ли подгоняться размер выпадающего списка под размер элементов, чтобы был видны названия всех элементов полностью. |
Событие | Описание |
---|---|
Click | Хранит ссылку на процедуру, которая выполнится при щелчке по выпадающему списку. |
SelectedIndexChanged | Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента выпадающего списка. |
Ниже a — выпадающий список.
Функция | Описание |
---|---|
a.Items.Add | Добавляет в выпадающий список элемент. |
a.Items.Clear | Удаляет все элементы выпадающего списка. |
GroupBox[править]
System.Windows.Forms.GroupBox- класс фрейма. Синтаксис его создания:
name — имя кнопки.
Свойство | Значение |
---|---|
Width | Ширина фрейма. |
Height | Высота фрейма. |
Text | Текст на в заголовке фрейма. |
Location | Позиция фрейма на форме.
В качестве значения должна быть точка System.Drawing.Point. |
AutoSize | Будет ли меняться размер фрейма, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на кнопке. |
Parent | Родительский виджет. |
Visible | Виден ли фрейм. |
SplitContainer[править]
System.Windows.Forms.SplitContainer — класс элемента разделения окна. Синтаксис его создания:
name := new SplitContainer();
name — имя элемента разделения окна.
Свойство | Значение |
---|---|
Width | Ширина элемента разделения окна. |
Height | Высота элемента разделения окна. |
Location | Позиция элемента разделения окна на форме.
В качестве значения должна быть точка System.Drawing.Point. |
AutoSize | Будет ли меняться размер элемента разделения окна, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на элементе разделения окна. |
Visible | Виден ли элемент разделения окна. |
Orientation | Ориентация элемента разделения окна.
|
Parent | Родительский виджет. |
Panel1 | Имя виджета, входящего в левую или верхнюю часть элемента разделения окна. |
Panel2 | Имя виджета, входящего в правую или нижнюю часть элемента разделения окна. |
[править]
System.Windows.Forms.MenuStrip — класс главного меню. Синтаксис его создания:
name := new MenuStrip ();
name — имя главного меню.
Свойство | Значение |
---|---|
BackColor | Цвет фона главного меню. |
ForeColor | Цвет текста меню. |
GripStyle | Видим ли объект для перемещения меню, находящийся слева.
|
Ниже a — главное меню.
Процедура | Значение |
---|---|
a.Items.Add(k) | Добавляет подменю k в главное меню. |
[править]
System.Windows.Forms.ToolStripMenuItem — класс подменю. Синтаксис его создания:
name := new ToolStripMenuItem ();
name — имя подменю.
Свойство | Значение |
---|---|
BackColor | Цвет фона заголовка подменю. |
ForeColor | Цвет текста заголовка подменю. |
Ниже b — подменю.
Процедура | Значение |
---|---|
b.DropDownItems.Add(t,i,act) | Добавляет пункт в подменю b.
|
Форма[править]
System.Windows.Forms.Form — класс формы. Общий синтаксис ее создания:
Свойство | Описане |
---|---|
Text | Заголовок формы. |
Ниже a — форма.
Свойство | Описане |
---|---|
a.Controls.Add(виджет) | Добавляет виджет на форму. |
Курсор[править]
Cursor — объект курсора в Windows Forms.
Свойство | Значение |
---|---|
System.Windows.Forms.Cursor.Position.X | Позиция курсора по X. |
System.Windows.Forms.Cursor.Position.Y | Позиция курсора по Y. |
Обработка событий[править]
Любая процедура, являющаяся обработчиком события должна иметь вид:
procedure p(sender:object; args:System.EventArgs); begin //тело процедуры end;
p — имя процедуры.
Стили[править]
Подключить визуальные стили для более красивого отображения виджетов можно так:
Application.EnableVisualStyles;
Примеры программ[править]
- Вывод сообщения по нажатию кнопки:
{$reference 'System.Windows.Forms.dll'} {$reference 'System.Drawing.dll'} uses System, System.Windows.Forms; var f : Form; btn : Button; procedure ButtonClick(sender: object; e: EventArgs); begin MessageBox.Show('Hello world!'); end; begin f := new Form; btn := new Button; btn.Text := 'Click me'; btn.Click += ButtonClick; f.Controls.Add(btn); Application.Run(f); end.
I have a windows forms application with some controls added to the designer. When I want to change something (LIKE) enabling a text box from inside the Form1.cs, I simply use:
textBox1.Enabled = true;
but now I have a separated class called class1.cs.
How could I enable textBox1 from a static function class1.cs?
NOTE: I did not try any code because I am totally clueless about doing this.
Oriol Roma
3011 gold badge4 silver badges9 bronze badges
asked Oct 19, 2012 at 22:42
Roman RatskeyRoman Ratskey
5,0597 gold badges43 silver badges67 bronze badges
3
EDIT: Lot of edit.
public partial class Form1 : Form
{
// Static form. Null if no form created yet.
private static Form1 form = null;
private delegate void EnableDelegate(bool enable);
public Form1()
{
InitializeComponent();
form = this;
}
// Static method, call the non-static version if the form exist.
public static void EnableStaticTextBox(bool enable)
{
if (form != null)
form.EnableTextBox(enable);
}
private void EnableTextBox(bool enable)
{
// If this returns true, it means it was called from an external thread.
if (InvokeRequired)
{
// Create a delegate of this method and let the form run it.
this.Invoke(new EnableDelegate(EnableTextBox), new object[] { enable });
return; // Important
}
// Set textBox
textBox1.Enabled = enable;
}
}
answered Oct 19, 2012 at 22:45
LightStrikerLightStriker
19.3k3 gold badges23 silver badges27 bronze badges
15
This is just another method:
TextBox t = Application.OpenForms["Form1"].Controls["textBox1"] as TextBox;
answered Aug 11, 2016 at 13:44
3
You shouldn’t really change UI controls in your Form
from your class1, but instead create a method or a property in class1 that would tell if the textbox should be enabled or not.
Example:
// I changed the name class1 to MySettings
public class MySettings
{
public bool ShouldTextBoxBeEnabled()
{
// Do some logic here.
return true;
}
// More generic
public static bool SetTextBoxState(TextBox textBox)
{
// Do some logic here.
textBox.Enabled = true;
}
// Or static property (method if you like)
public static StaticShouldTextBoxBeEnabled { get { return true; } }
}
Then in your form:
MySettings settings = new MySettings();
textBox1.Enabled = settings.ShouldTextBoxBeEnabled();
// Or static way
textBox1.Enabled = MySettings.StaticShouldTextBoxBeEnabled;
// Or this way you can send in all textboxes you want to do the logic on.
MySettings.SetTextBoxState(textBox1);
answered Oct 19, 2012 at 22:50
Mario SMario S
11.6k24 gold badges38 silver badges47 bronze badges
0
You can pass the instance of your Form to the class
MyForm frm = new MyForm();
MyClass c = new MyClass(frm);
Then your class can take that instance and access the textbox
public class MyClass
{
public MyClass(MyForm f)
{
f.TextBox1.Enabled = false;
}
}
The design does not look OK
It is better to call the class in your form and based on the value returned, manipulate the textbox
//MyForm Class
MyClass c = new MyClass();
c.DoSomethings();
if(c.getResult() == requiredValue)
textBox1.enabled = true;
else
textBox1.enabled = false;
//MyForm Class ends here
UPDATE
public class Class1
{
public static int SomeFunction()
{
int result = 1;
return result;
}
public static void SomeFunction(out int result)
{
result = 1;
}
}
Usage
if(Class1.SomeFunction() == 1)
textBox1.Enabled = true;
else
textBox1.Enabled = false;
OR
int result = 0;
Class1.SomeFunction(out result);
if(result == 1)
textBox1.Enabled = true;
else
textBox1.Enabled = false;
answered Oct 19, 2012 at 22:50
codingbizcodingbiz
25.9k8 gold badges55 silver badges94 bronze badges
3
You could let your class1 have an event to enable the Textbox.
public class Class1
{
public event Action<object, EventArgs> subscribe ;
private void raiseEvent()
{
var handler = subscribe ;
if(handler!=null)
{
handler(this,EventArgs.Empty);//Raise the enable event.
}
}
}
Let the class containing the TextBox subscribe to it somehow. In TextBox wrapper class
public class TextBoxWrapper
public void EnablePropertyNotification(object sender, EventArgs args)
{
TextBox1.Enabled = true ; //Enables textbox when event is raised.
}
public TextBoxWrapper()
{
class1Instance.subscribe+=EnablePropertyNotification ;
}
answered Oct 19, 2012 at 22:50
Lews TherinLews Therin
10.9k4 gold badges46 silver badges71 bronze badges
4
To access/modify a Form Element property, just write this in your outside Class.
Form1.ActiveForm.Controls["textBox1"].Enabled = true;
Where textBox1
is the variable name of TextBox.
What this actually does: Gets the active Form object’s control specified by the name in string.
WARNING: Active form means the form which is currently open and focused on. If you do something else on your computer, with your minimized WindowsForm application, the Form1.ActiveForm
will not get the form, instead, it will give null
, which can lead to errors later. Be careful!
answered Nov 16, 2019 at 15:36
Ali SajjadAli Sajjad
2,94325 silver badges35 bronze badges
based on the answer from @vr_driver you can do that to avoid problems with other containers like groupbox, panels…
TextBox t = Application.OpenForms["Form1"].Controls.Find("textBox1", true)[0] as TextBox;
answered Oct 16, 2020 at 19:35
1
In this example you have a form called Main.cs and a class called MyClass:
In MyClass (Note: the name of my Form Class = ‘Main’):
Main ui = new Main();
ui.toolStripProgressBarStickers.PerformStep();
In (FormName).Designer.cs so in my case Main.designer.cs change the appropriate control from ‘private’ to ‘public’:
public System.Windows.Forms.ToolStripProgressBar toolStripProgressBarStickers;
This solved it for me.
Thanks, Ensai Tankado
answered Apr 23, 2021 at 11:46
I had to do this at work and didn’t find that any of these answers matched what I ended up doing, so I’m showing how I made it work.
First, initialize a copy of your class in your load event.
NameOfClass newNameofClass;
Then you want to bind to your class (in the load event):
textBox1.DataBindings.Add(new Binding("Enabled", newNameofClass, "textBox1Enabled"));
In your class, do the following:
private bool textBox1Enabled = false;
public bool TextBox1Enabled
{
get
{
return textBox1Enabled;
}
set
{
textBox1Enabled = value;
}
}
- The false setting will initialize your textbox to being disabled
- Set textBox1Enabled to true if you want to enable by default.
- If you have other logic to enable/disable the textbox, simply modify the value of textBox1Enabled accordingly.
answered Oct 3, 2018 at 18:36
noelnoel
3833 silver badges17 bronze badges
Very easy:
Create an Instance of your Form Object where want to access the Elements from.
Form1 ui = new Form1();
and now change the Form Elements to «public» — like this in the Designer Code:
...
public System.Windows.Forms.TextBox textBox6;
...
Now you can access them like this in your Code:
ui.textBox6 ...
Dharman♦
29.3k21 gold badges80 silver badges131 bronze badges
answered Mar 25, 2021 at 21:18
I had the same problem. I used windows forms & Visual Studio to generate a UI in a utility with textbox, checkbox, and button controls but ALL the code was in the same class.
I’m rewriting the utility now that I know «more» OOP concepts and created actual objects and separate classes. I too had problems getting the separate classes to be able to access the form controls and any shared methods that are in the form class. I tried the various suggestions in this thread as well as other threads but none of those solutions worked for me.
What worked for me (not sure if its the right thing to do or not) was I had each class that needed to access the controls and forms methods inherit from the Form.
Here is the relevant part of the Form.cs file:
namespace Utility
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void WriteNote(string noteText, bool asHeading = false)
{
//Writes Messages to the Message box in the UI
Font font1 = new Font(this.ResultsTB.Font, FontStyle.Bold);
Font font2 = new Font(this.ResultsTB.Font, FontStyle.Regular);
if (asHeading)
this.ResultsTB.Font = font1;
else
this.ResultsTB.Font = font2;
this.ResultsTB.AppendText(noteText + "rn");
}
My Form contains a textbox called DirTB and a method called «WriteNote» that writes info to another textbox called ResultsTB. Here is the class (at least as far down as the first successful call of the WriteNote method from the Form:
namespace Utility
{
public class AppServerDTO : Form1
{
#region App Server attributes
//attributes listed here
#endregion App Server attributes
#region AppServerDTO Constructor
public AppServerDTO()
{
//These methods verify and set all the attributes
VerifyInstallFolder();
}//end of constructor AppServer
#endregion AppServerDTO Constructor
#region AppServerDTO class methods
public void VerifyInstallFolder()
{
string keypath = string.Empty;
string locationVerification = DirTB.Text + @"SomeText";
for (int i = 0; i < 4; i++) //allows 3 attempts to get the install folder right
{
if (Directory.Exists(locationVerification))
{
i = 4;//Kills the loop
}
else if (!Directory.Exists(locationVerification))
{
locationVerification = DirTB.Text + @"SomeMoreText";
}
else if (!Directory.Exists(locationVerification))
{
WriteNote("The directory listed in the Install Directoy box is not reachable.");
WriteNote("Please select the correct directory.");
WriteNote("The correct directory is the folder that contains the ApplicationUpdates & UpdateManager folders.");
WriteNote(@"i.e. C:Somewhere or D:SomeplaceSomewhere");
var folderpath = FolderPrompt(@"C:");
DirTB.Text = folderpath; //updates the install folder textbox to the new location
keypath = folderpath;
i++;
}
}//end for loop
}//end VerifyInstallFolder
As long as you are very careful with what you mark as public vs private, it should be ok.
answered Sep 22, 2022 at 0:21
MariaNexMariaNex
31 silver badge4 bronze badges
This is how you should do :
I wrote the code below in my form class :
public static Form1 form = null;
private delegate void SetImageDelegate(Image image);
public Form1()
{
InitializeComponent();
form = this;
}
public static void SetStaticImage(Image image)
{
if (form != null)
form.pic1.Image = image;
}
private void setImage(Image img)
{
// If this returns true, it means it was called from an external thread.
if (InvokeRequired)
{
// Create a delegate of this method and let the form run it.
this.Invoke(new SetImageDelegate(setImage), new object[] { img });
return; // Important
}
// Set textBox
pic1.Image = img;
}
and the code below should be in anouther class :
Form1 frm= Form1.form;
frm.pic1.Image = image;
Note that i changed private static Form1 form = null;
to public static Form1 form = null;
Good Luck … Written by Hassan Eskandari
answered Dec 1, 2014 at 8:33
I have a windows forms application with some controls added to the designer. When I want to change something (LIKE) enabling a text box from inside the Form1.cs, I simply use:
textBox1.Enabled = true;
but now I have a separated class called class1.cs.
How could I enable textBox1 from a static function class1.cs?
NOTE: I did not try any code because I am totally clueless about doing this.
Oriol Roma
3011 gold badge4 silver badges9 bronze badges
asked Oct 19, 2012 at 22:42
Roman RatskeyRoman Ratskey
5,0597 gold badges43 silver badges67 bronze badges
3
EDIT: Lot of edit.
public partial class Form1 : Form
{
// Static form. Null if no form created yet.
private static Form1 form = null;
private delegate void EnableDelegate(bool enable);
public Form1()
{
InitializeComponent();
form = this;
}
// Static method, call the non-static version if the form exist.
public static void EnableStaticTextBox(bool enable)
{
if (form != null)
form.EnableTextBox(enable);
}
private void EnableTextBox(bool enable)
{
// If this returns true, it means it was called from an external thread.
if (InvokeRequired)
{
// Create a delegate of this method and let the form run it.
this.Invoke(new EnableDelegate(EnableTextBox), new object[] { enable });
return; // Important
}
// Set textBox
textBox1.Enabled = enable;
}
}
answered Oct 19, 2012 at 22:45
LightStrikerLightStriker
19.3k3 gold badges23 silver badges27 bronze badges
15
This is just another method:
TextBox t = Application.OpenForms["Form1"].Controls["textBox1"] as TextBox;
answered Aug 11, 2016 at 13:44
3
You shouldn’t really change UI controls in your Form
from your class1, but instead create a method or a property in class1 that would tell if the textbox should be enabled or not.
Example:
// I changed the name class1 to MySettings
public class MySettings
{
public bool ShouldTextBoxBeEnabled()
{
// Do some logic here.
return true;
}
// More generic
public static bool SetTextBoxState(TextBox textBox)
{
// Do some logic here.
textBox.Enabled = true;
}
// Or static property (method if you like)
public static StaticShouldTextBoxBeEnabled { get { return true; } }
}
Then in your form:
MySettings settings = new MySettings();
textBox1.Enabled = settings.ShouldTextBoxBeEnabled();
// Or static way
textBox1.Enabled = MySettings.StaticShouldTextBoxBeEnabled;
// Or this way you can send in all textboxes you want to do the logic on.
MySettings.SetTextBoxState(textBox1);
answered Oct 19, 2012 at 22:50
Mario SMario S
11.6k24 gold badges38 silver badges47 bronze badges
0
You can pass the instance of your Form to the class
MyForm frm = new MyForm();
MyClass c = new MyClass(frm);
Then your class can take that instance and access the textbox
public class MyClass
{
public MyClass(MyForm f)
{
f.TextBox1.Enabled = false;
}
}
The design does not look OK
It is better to call the class in your form and based on the value returned, manipulate the textbox
//MyForm Class
MyClass c = new MyClass();
c.DoSomethings();
if(c.getResult() == requiredValue)
textBox1.enabled = true;
else
textBox1.enabled = false;
//MyForm Class ends here
UPDATE
public class Class1
{
public static int SomeFunction()
{
int result = 1;
return result;
}
public static void SomeFunction(out int result)
{
result = 1;
}
}
Usage
if(Class1.SomeFunction() == 1)
textBox1.Enabled = true;
else
textBox1.Enabled = false;
OR
int result = 0;
Class1.SomeFunction(out result);
if(result == 1)
textBox1.Enabled = true;
else
textBox1.Enabled = false;
answered Oct 19, 2012 at 22:50
codingbizcodingbiz
25.9k8 gold badges55 silver badges94 bronze badges
3
You could let your class1 have an event to enable the Textbox.
public class Class1
{
public event Action<object, EventArgs> subscribe ;
private void raiseEvent()
{
var handler = subscribe ;
if(handler!=null)
{
handler(this,EventArgs.Empty);//Raise the enable event.
}
}
}
Let the class containing the TextBox subscribe to it somehow. In TextBox wrapper class
public class TextBoxWrapper
public void EnablePropertyNotification(object sender, EventArgs args)
{
TextBox1.Enabled = true ; //Enables textbox when event is raised.
}
public TextBoxWrapper()
{
class1Instance.subscribe+=EnablePropertyNotification ;
}
answered Oct 19, 2012 at 22:50
Lews TherinLews Therin
10.9k4 gold badges46 silver badges71 bronze badges
4
To access/modify a Form Element property, just write this in your outside Class.
Form1.ActiveForm.Controls["textBox1"].Enabled = true;
Where textBox1
is the variable name of TextBox.
What this actually does: Gets the active Form object’s control specified by the name in string.
WARNING: Active form means the form which is currently open and focused on. If you do something else on your computer, with your minimized WindowsForm application, the Form1.ActiveForm
will not get the form, instead, it will give null
, which can lead to errors later. Be careful!
answered Nov 16, 2019 at 15:36
Ali SajjadAli Sajjad
2,94325 silver badges35 bronze badges
based on the answer from @vr_driver you can do that to avoid problems with other containers like groupbox, panels…
TextBox t = Application.OpenForms["Form1"].Controls.Find("textBox1", true)[0] as TextBox;
answered Oct 16, 2020 at 19:35
1
In this example you have a form called Main.cs and a class called MyClass:
In MyClass (Note: the name of my Form Class = ‘Main’):
Main ui = new Main();
ui.toolStripProgressBarStickers.PerformStep();
In (FormName).Designer.cs so in my case Main.designer.cs change the appropriate control from ‘private’ to ‘public’:
public System.Windows.Forms.ToolStripProgressBar toolStripProgressBarStickers;
This solved it for me.
Thanks, Ensai Tankado
answered Apr 23, 2021 at 11:46
I had to do this at work and didn’t find that any of these answers matched what I ended up doing, so I’m showing how I made it work.
First, initialize a copy of your class in your load event.
NameOfClass newNameofClass;
Then you want to bind to your class (in the load event):
textBox1.DataBindings.Add(new Binding("Enabled", newNameofClass, "textBox1Enabled"));
In your class, do the following:
private bool textBox1Enabled = false;
public bool TextBox1Enabled
{
get
{
return textBox1Enabled;
}
set
{
textBox1Enabled = value;
}
}
- The false setting will initialize your textbox to being disabled
- Set textBox1Enabled to true if you want to enable by default.
- If you have other logic to enable/disable the textbox, simply modify the value of textBox1Enabled accordingly.
answered Oct 3, 2018 at 18:36
noelnoel
3833 silver badges17 bronze badges
Very easy:
Create an Instance of your Form Object where want to access the Elements from.
Form1 ui = new Form1();
and now change the Form Elements to «public» — like this in the Designer Code:
...
public System.Windows.Forms.TextBox textBox6;
...
Now you can access them like this in your Code:
ui.textBox6 ...
Dharman♦
29.3k21 gold badges80 silver badges131 bronze badges
answered Mar 25, 2021 at 21:18
I had the same problem. I used windows forms & Visual Studio to generate a UI in a utility with textbox, checkbox, and button controls but ALL the code was in the same class.
I’m rewriting the utility now that I know «more» OOP concepts and created actual objects and separate classes. I too had problems getting the separate classes to be able to access the form controls and any shared methods that are in the form class. I tried the various suggestions in this thread as well as other threads but none of those solutions worked for me.
What worked for me (not sure if its the right thing to do or not) was I had each class that needed to access the controls and forms methods inherit from the Form.
Here is the relevant part of the Form.cs file:
namespace Utility
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void WriteNote(string noteText, bool asHeading = false)
{
//Writes Messages to the Message box in the UI
Font font1 = new Font(this.ResultsTB.Font, FontStyle.Bold);
Font font2 = new Font(this.ResultsTB.Font, FontStyle.Regular);
if (asHeading)
this.ResultsTB.Font = font1;
else
this.ResultsTB.Font = font2;
this.ResultsTB.AppendText(noteText + "rn");
}
My Form contains a textbox called DirTB and a method called «WriteNote» that writes info to another textbox called ResultsTB. Here is the class (at least as far down as the first successful call of the WriteNote method from the Form:
namespace Utility
{
public class AppServerDTO : Form1
{
#region App Server attributes
//attributes listed here
#endregion App Server attributes
#region AppServerDTO Constructor
public AppServerDTO()
{
//These methods verify and set all the attributes
VerifyInstallFolder();
}//end of constructor AppServer
#endregion AppServerDTO Constructor
#region AppServerDTO class methods
public void VerifyInstallFolder()
{
string keypath = string.Empty;
string locationVerification = DirTB.Text + @"SomeText";
for (int i = 0; i < 4; i++) //allows 3 attempts to get the install folder right
{
if (Directory.Exists(locationVerification))
{
i = 4;//Kills the loop
}
else if (!Directory.Exists(locationVerification))
{
locationVerification = DirTB.Text + @"SomeMoreText";
}
else if (!Directory.Exists(locationVerification))
{
WriteNote("The directory listed in the Install Directoy box is not reachable.");
WriteNote("Please select the correct directory.");
WriteNote("The correct directory is the folder that contains the ApplicationUpdates & UpdateManager folders.");
WriteNote(@"i.e. C:Somewhere or D:SomeplaceSomewhere");
var folderpath = FolderPrompt(@"C:");
DirTB.Text = folderpath; //updates the install folder textbox to the new location
keypath = folderpath;
i++;
}
}//end for loop
}//end VerifyInstallFolder
As long as you are very careful with what you mark as public vs private, it should be ok.
answered Sep 22, 2022 at 0:21
MariaNexMariaNex
31 silver badge4 bronze badges
This is how you should do :
I wrote the code below in my form class :
public static Form1 form = null;
private delegate void SetImageDelegate(Image image);
public Form1()
{
InitializeComponent();
form = this;
}
public static void SetStaticImage(Image image)
{
if (form != null)
form.pic1.Image = image;
}
private void setImage(Image img)
{
// If this returns true, it means it was called from an external thread.
if (InvokeRequired)
{
// Create a delegate of this method and let the form run it.
this.Invoke(new SetImageDelegate(setImage), new object[] { img });
return; // Important
}
// Set textBox
pic1.Image = img;
}
and the code below should be in anouther class :
Form1 frm= Form1.form;
frm.pic1.Image = image;
Note that i changed private static Form1 form = null;
to public static Form1 form = null;
Good Luck … Written by Hassan Eskandari
answered Dec 1, 2014 at 8:33