Как Работать С 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‑подход рассчитан на одного пользователя.

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

Amazon возвращается в смартфоны с AI-усиленным «Transformer»: что это значит для
пользователей
Amazon возвращается в смартфоны с AI-усиленным «Transformer»: что это значит для пользователей

Ключевые выводы Amazon разрабатывает новый смартфон под кодовым названием "Transformer" через 11 лет после неудачи Fire Phone Устройство будет интегрировано с экосистемой Amazon: Shopping, Prime Video, Prime Music и Alexa …

Clarifai удалила 3 млн фотографий OkCupid: что случилось и почему это важно для
пользователей
Clarifai удалила 3 млн фотографий OkCupid: что случилось и почему это важно для пользователей

Ключевые выводы Clarifai удалила около 3 млн фотографий, которые в 2014 году получила от OkCupid для обучения систем распознавания лиц. Расследование FTC показало, что передача данных нарушала политику конфиденциальности OkCupid …

Как курьеры DoorDash спасают беспилотники Waymo: ироничный поворот в развитии
роботакси
Как курьеры DoorDash спасают беспилотники Waymo: ироничный поворот в развитии роботакси

Ключевые выводы Waymo платит до $11.25 курьерам за закрытие дверей своих беспилотников Открытая дверь полностью обездвиживает робомобиль В Лос-Анджелесе аналогичные услуги стоят компании до $24 за задание Проблема решится с …

Как AI‑платформа Pair Team попала в федеральный эксперимент ACCESS и что это
значит для хронической медицины
Как AI‑платформа Pair Team попала в федеральный эксперимент ACCESS и что это значит для хронической медицины

Ключевые выводы Pair Team вошёл в ACCESS – 10‑летний эксперимент CMS, где оплату привязывают к результатам, а не к времени врача. AI‑агент Flora обеспечивает круглосуточный контакт, помогает с соц‑проблемами и …

YouTube TV представляет персонализированные пакеты: до $28 экономии для зрителей
YouTube TV представляет персонализированные пакеты: до $28 экономии для зрителей

Ключевые выводы YouTube TV предлагает 10+ планов дешевле базового ($82.99) — от $54.99 в месяц Самый выгодный вариант — Entertainment: экономия $28 + локальные каналы Новинка решает проблему переплаты за …

SpaceX готовится к IPO: кто владеет акциями и сколько они могут стоить?
SpaceX готовится к IPO: кто владеет акциями и сколько они могут стоить?

Ключевые выводы Ожидаемая оценка SpaceX после IPO – около $1,7 трлн, а сбор средств может достичь $75 млрд. Элон Маск уже контролирует более 6,4 млрд акций (около 85 % голосов) …

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