Как Работать С Windows Forms — Создаем Трекер Привычек Пошагово

Кратко:

  • Создаём проект Windows Forms в VS 2026.
  • Настраиваем UI: TextBox, Buttons, DataGridView, DateTimePicker, Chart.
  • Пишем логику на C#, сохраняем данные в JSON.
  • Связываем события, публикуем .exe и получаем готовый трекер.

Если вам нужно быстро собрать приложение‑трекер привычек, следуйте 7‑шаговому плану: Как работать с Windows Forms — создаем трекер привычек пошагово.

Шаг 1. Подготовка среды разработки и создание проекта

Откройте Visual Studio 2026. В стартовом окне выберите Создать новый проект, в поиске введите winforms и выберите шаблон Приложение Windows Forms (.NET Framework) для C#. Укажите имя HabitTracker и нажмите Создать. Это первая часть того, как работать с Windows Forms — создаем трекер привычек пошагово.

Проверка обязательных компонентов

  • .NET Framework 4.8 (или новее).
  • Пакет System.Windows.Forms уже включён.
  • Убедитесь, что в меню Среда → Параметры → Система включён Режим совместимости для Windows 10‑12.

Шаг 2. Установка NuGet‑пакетов и планировка интерфейса

В Обозревателе решений кликните правой кнопкой по проекту → Управление пакетами NuGet. На вкладке Обзор установите:

  • System.Windows.Forms.DataVisualization – графики.
  • Newtonsoft.Json – работа с JSON‑файлом.

После установки откройте Toolbox (CTRL+ALT+X) и разместите элементы:

  • TextBox — txtHabitName.
  • Button — btnAdd, btnDelete, btnMark.
  • DataGridView — dgvHabits.
  • DateTimePicker — dtpDate.
  • Chart — chartProgress.

Разделите форму на две колонки: слева – ввод и кнопки, справа – таблица, а внизу разместите график. Такой макет помогает увидеть, как работать с Windows Forms — создаем трекер привычек пошагово, без ощущения «захламленности».

Шаг 3. Моделирование данных: класс Habit и хранение в JSON

Создайте в проекте файл Habit.cs и добавьте:

public class Habit
{
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public bool IsCompleted { get; set; }
}

Список List<Habit> habits будет хранить все записи в памяти, а путь habits.json — в файле рядом с .exe. Этот подход, описанный в нашем руководстве, реализует принцип «как работать с Windows Forms — создаем трекер привычек пошагово» без внешних БД.

Шаг 4. Реализация бизнес‑логики в Form1.cs

Откройте конструктор формы, дважды кликните по пустому месту – откроется Form1.cs. Замените содержимое следующим кодом (компактно, но полностью):

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Newtonsoft.Json;
using System.Windows.Forms.DataVisualization.Charting;

namespace HabitTracker
{
    public partial class Form1 : Form
    {
        private List<Habit> habits = new List<Habit>();
        private readonly string filePath = "habits.json";

        public Form1()
        {
            InitializeComponent();
            LoadData();
            dtpDate.ValueChanged += dtpDate_ValueChanged;
            UpdateChart();
        }

        private void LoadData()
        {
            if (File.Exists(filePath))
            {
                var json = File.ReadAllText(filePath);
                habits = JsonConvert.DeserializeObject<List<Habit>>(json) ?? new List<Habit>();
            }
            RefreshGrid();
        }

        private void SaveData()
        {
            var json = JsonConvert.SerializeObject(habits, Formatting.Indented);
            File.WriteAllText(filePath, json);
        }

        private void RefreshGrid()
        {
            dgvHabits.DataSource = null;
            dgvHabits.DataSource = habits;
            if (dgvHabits.Columns.Count > 0)
            {
                dgvHabits.Columns["Name"].HeaderText = "Привычка";
                dgvHabits.Columns["Date"].HeaderText = "Дата";
                dgvHabits.Columns["IsCompleted"].HeaderText = "Выполнено";
                dgvHabits.Columns["Date"].DefaultCellStyle.Format = "dd.MM.yyyy";
                dgvHabits.Columns["IsCompleted"].ReadOnly = true;
                dgvHabits.Columns["IsCompleted"].DefaultCellStyle.NullValue = false;
                dgvHabits.Columns["IsCompleted"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            }
            UpdateChart();
        }

        private void UpdateChart()
        {
            chartProgress.Series.Clear();
            var series = chartProgress.Series.Add("Прогресс");
            series.ChartType = SeriesChartType.Column;
            var selected = dtpDate.Value.Date;
            var dayHabits = habits.Where(h => h.Date == selected).ToList();
            double percent = 0;
            if (dayHabits.Any())
                percent = dayHabits.Count(h => h.IsCompleted) * 100.0 / dayHabits.Count;
            series.Points.AddXY(selected.ToShortDateString(), percent);
            chartProgress.ChartAreas[0].AxisX.Title = "Дата";
            chartProgress.ChartAreas[0].AxisY.Title = "% выполнения";
            chartProgress.ChartAreas[0].AxisY.Maximum = 100;
            chartProgress.ChartAreas[0].AxisY.Minimum = 0;
        }

        private void dtpDate_ValueChanged(object sender, EventArgs e) => UpdateChart();

        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(txtHabitName.Text))
            {
                MessageBox.Show("Введите название привычки!");
                return;
            }
            habits.Add(new Habit
            {
                Name = txtHabitName.Text,
                Date = dtpDate.Value.Date,
                IsCompleted = false
            });
            SaveData();
            RefreshGrid();
            txtHabitName.Clear();
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (dgvHabits.CurrentRow?.DataBoundItem is Habit h)
            {
                habits.Remove(h);
                SaveData();
                RefreshGrid();
            }
        }

        private void btnMark_Click(object sender, EventArgs e)
        {
            if (dgvHabits.CurrentRow?.DataBoundItem is Habit h)
            {
                h.IsCompleted = !h.IsCompleted;
                SaveData();
                RefreshGrid();
            }
        }
    }
}

Эти 7 ключевых методов показывают, как работать с Windows Forms — создаем трекер привычек пошагово, полностью покрывая CRUD‑операции и визуализацию.

Шаг 5. Привязка событий к элементам управления

Перейдите в дизайнер формы, выберите каждую кнопку, откройте окно Свойства → События (молния) и укажите:

  • btnAdd → Click = btnAdd_Click
  • btnDelete → Click = btnDelete_Click
  • btnMark → Click = btnMark_Click

Это завершающий этап того, как работать с Windows Forms — создаем трекер привычек пошагово, позволяя UI‑элементам управлять бизнес‑логикой.

Шаг 6. Тестирование и отладка

Запустите проект (F5). Проверьте:

  1. Ввод названия в txtHabitName и нажмите Добавить → строка появляется в dgvHabits.
  2. Выберите строку и нажмите Отметить → галочка меняется, график обновляется.
  3. Удалите запись → её больше нет в таблице и файле JSON.

Если что‑то не работает, откройте окно Output и ищите исключения. Такие мелкие правки часто встречаются в реальном опыте создания Windows‑приложений.

Шаг 7. Публикация готового .exe

В решении кликните правой кнопкой → Опубликовать. Выберите профиль «Папка», укажите каталог, нажмите Опубликовать. В результате получите набор файлов, среди которых HabitTracker.exe. Теперь можно копировать приложение на любой ПК без установки Visual Studio.

Эти семь шагов полностью отвечают на вопрос, как работать с Windows Forms — создаем трекер привычек пошагово, и дают готовый продукт за пару часов.

Таблица сравнения подходов к хранению данных

МетодТребуемый кодНагрузка на приложениеНужна внешняя СУБД?
JSON‑файлNewtonsoft.Json + File I/OНизкая (меньше 10 KB для 100 записей)Нет
SQLiteSystem.Data.SQLite + SQL‑запросыСредняя (пакет ~300 KB)Нет, но нужен движок
SQL Server ExpressEntity Framework + миграцииВысокая (требует установки сервера)Да

Типичные ошибки и как их избежать (E‑E‑A‑T)

Ошибка 1. Не сохраняются изменения после закрытия

Причина: забыли вызвать SaveData() после изменения списка. Добавьте вызов в каждый обработчик (Add, Delete, Mark).

Ошибка 2. Дата в графике отображается неверно

Причина: dtpDate.Value возвращает время, а сравнение происходит с датой без времени. Убедитесь, что используете .Date.

Ошибка 3. Приложение падает при пустом JSON

Причина: попытка десериализовать пустой файл. Проверьте File.Exists и задайте habits = new List<Habit>() при отсутствии данных.

Где искать помощь и обновления

  • Официальная документация Microsoft по Windows Forms (2026 г.)
  • GitHub‑репозиторий Newtonsoft.Json – примеры сериализации.
  • Stack Overflow: тег #winforms для вопросов о событиях и привязке данных.

Итог: следуя этим 7 шагам, вы быстро освоите, как работать с Windows Forms — создаем трекер привычек пошагово, получив лёгкое, самодостаточное приложение, которое сохраняет данные в JSON и визуализирует прогресс.

FAQ

Можно ли использовать .NET 6 вместо .NET Framework?
Да, процесс почти идентичен, только в NuGet‑пакетах замените System.Windows.Forms.DataVisualization на совместимый для .NET 6.
Где хранится файл habits.json?
Он находится в папке рядом с исполняемым файлом HabitTracker.exe. При первом запуске будет создан автоматически.
Можно ли добавить уведомления о предстоящих привычках?
Да, используйте System.Threading.Timer вместе с NotifyIcon для вывода всплывающих подсказок.
Как экспортировать данные в Excel?
Сериализуйте список в CSV через StringBuilder и сохраните через SaveFileDialog – Excel откроет файл без проблем.
Поддерживает ли приложение многопользовательскую работу?
Для совместного доступа понадобится серверная база (например, SQLite через сетевой путь) – базовый JSON‑подход рассчитан на одного пользователя.

Интересно почитать :

Lucid Motors назначила нового CEO — Сильвио Нааполи, а Uber увеличил инвестиции
до $500 млн
Lucid Motors назначила нового CEO — Сильвио Нааполи, а Uber увеличил инвестиции до $500 млн

Ключевые выводы Сильвио Нааполи, бывший топ‑менеджер Schindler Group, стал новым генеральным директором Luc Motors. Uber вложил дополнительные $200 млн, увеличив общий объём инвестиций в компанию до $500 млн и заказав …

«Рынок смерти»: Как Polymarket допустил ставки на спасение военных и
спровоцировал скандал
«Рынок смерти»: Как Polymarket допустил ставки на спасение военных и спровоцировал скандал

Ключевые выводы Прогнозный рынок Polymarket временно разрешил ставки на дату спасения американских военных, сбитых над Ираном, что вызвало жёсткую критику со стороны конгрессмена Сета Молтона. Молтон назвал платформу «дистопийным рынком …

Ядерный синтез: почему энергия будущего ближе, чем кажется
Ядерный синтез: почему энергия будущего ближе, чем кажется

Ключевые выводы Ядерный синтез обещает чистую, практически неисчерпаемую энергию, используя тот же процесс, что и в звездах Более $10 млрд инвестиций привлечено в стартапы термоядерной энергетики, и дюжина из них …

Neurable открывает «чтение мыслей» для носимых устройств: что это значит для
потребителей
Neurable открывает «чтение мыслей» для носимых устройств: что это значит для потребителей

Ключевые выводы Neurable предлагает лицензировать свою неинвазивную BCI‑технологию, позволяющую встраивать нейросенсоры в любые носимые устройства. Технология сочетает EEG‑датчики и AI‑обработку, даёт измерения когнитивных параметров без операции и подчиняется строгим HIPAA‑совместимым …

Фонд BKR Capital собрал $20 млн для поддержки технологических стартапов от
основателей из чернокожей общины
Фонд BKR Capital собрал $20 млн для поддержки технологических стартапов от основателей из чернокожей общины

Ключевые выводы BKR Capital закрыл $20 млн первого транша Fund II, приближаясь к цели в $50 млн Фонд инвестирует в технологические компании от основателей из чернокожей общины Канады Средний чек …

Google DeepMind инвестирует $75 млн в студию A24: что изменит ИИ в кино
Google DeepMind инвестирует $75 млн в студию A24: что изменит ИИ в кино

Ключевые выводы Google DeepMind вложил $75 млн в независимую студию A24, запустив первое в истории исследовательско‑производственное партнерство ИИ‑кино. Новые инструменты будут разрабатываться совместно с режиссерами и актёрами, чтобы ускорять подбор …

ФильтрИзбранноеМеню43750 ₽
Top