C#

Как использовать класс на других формах в C#

Чтобы использовать один класс на разных формах в C#, вынесите класс в отдельный файл, сделайте его public, проверьте namespace и создавайте объект там, где он нужен. Если формы должны работать с одним и тем же объектом, передавайте этот объект через конструктор, а не создавайте случайные копии

Создайте общий класс

Например, у вас есть корзина:

public class CartService
{
    private readonly List<string> _items = new();

    public void Add(string title)
    {
        _items.Add(title);
    }

    public int Count => _items.Count;
}

Сохраните класс в отдельном файле CartService.cs. Обычно он лежит в том же проекте, что и формы

Проверьте namespace

Если класс и формы находятся в одном пространстве имен, дополнительных действий может не понадобиться. Если в разных, добавьте using:

using MyShop.Services;

Ошибка The type or namespace name could not be found часто означает, что файл не добавлен в проект, класс не public или не подключен нужный namespace

Использование на одной форме

private readonly CartService _cart = new();

private void addButton_Click(object sender, EventArgs e)
{
    _cart.Add(productTextBox.Text);
    countLabel.Text = _cart.Count.ToString();
}

Так форма хранит объект сервиса и вызывает его методы

Где должен лежать код класса

Не пишите общий класс внутри файла формы, если он нужен в нескольких местах. Технически вложенные классы возможны, но для учебного и рабочего проекта понятнее отдельный файл: CartService.cs, OrderCalculator.cs, UserSettings.cs. Тогда класс легче найти, переиспользовать и подключить к другой форме без копирования кода

Если класс отвечает за расчеты или хранение данных, он не должен знать про кнопки и Label. Форма вызывает класс, а не наоборот. Это помогает не смешивать интерфейс и логику

Один объект на двух формах

Если Form1 и Form2 должны работать с одной корзиной, создайте объект в Form1 и передайте во вторую форму:

private readonly CartService _cart = new();

private void openButton_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2(_cart);
    form2.Show();
}

В Form2:

public partial class Form2 : Form
{
    private readonly CartService _cart;

    public Form2(CartService cart)
    {
        InitializeComponent();
        _cart = cart;
    }

    private void addButton_Click(object sender, EventArgs e)
    {
        _cart.Add("Товар из второй формы");
    }
}

Теперь обе формы работают с одним объектом, а не с двумя разными корзинами

Нужно ли static

static кажется быстрым решением: сделал общий класс и обращайся откуда угодно. Но для состояния приложения это часто приводит к путанице. Данные трудно сбросить, тестировать и контролировать. Для учебного WinForms-проекта лучше передавать объект явно. Так видно, какая форма от чего зависит

static нормально подходит для чистых вспомогательных методов, например форматирования строки. Но для корзины, пользователя, заказа, настроек и выбранных данных обычно нужен обычный объект

Частые ошибки

Первая ошибка — создать класс в файле, но оставить его internal или в другом namespace. Вторая — создавать новый объект класса на каждой форме и удивляться, почему данные не общие. Третья — делать все поля публичными. Четвертая — использовать static для всего приложения без причины

Мини-задача: создайте класс CounterService с методом Increment() и свойством Value. Передайте один объект CounterService в две формы. На каждой форме сделайте кнопку увеличения и проверьте, что счетчик общий

Что почитать дальше по C#

Что почитать дальше по C#

Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x