- Кратко:
- Шаг 1. Подготовка среды разработки и создание проекта
- Проверка обязательных компонентов
- Шаг 2. Установка NuGet‑пакетов и планировка интерфейса
- Шаг 3. Моделирование данных: класс Habit и хранение в JSON
- Шаг 4. Реализация бизнес‑логики в Form1.cs
- Шаг 5. Привязка событий к элементам управления
- Шаг 6. Тестирование и отладка
- Шаг 7. Публикация готового .exe
- Таблица сравнения подходов к хранению данных
- Типичные ошибки и как их избежать (E‑E‑A‑T)
- Ошибка 1. Не сохраняются изменения после закрытия
- Ошибка 2. Дата в графике отображается неверно
- Ошибка 3. Приложение падает при пустом JSON
- Где искать помощь и обновления
- FAQ
Кратко:
- Создаём проект 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_ClickbtnDelete→Click=btnDelete_ClickbtnMark→Click=btnMark_Click
Это завершающий этап того, как работать с Windows Forms — создаем трекер привычек пошагово, позволяя UI‑элементам управлять бизнес‑логикой.
Шаг 6. Тестирование и отладка
Запустите проект (F5). Проверьте:
- Ввод названия в
txtHabitNameи нажмите Добавить → строка появляется вdgvHabits. - Выберите строку и нажмите Отметить → галочка меняется, график обновляется.
- Удалите запись → её больше нет в таблице и файле JSON.
Если что‑то не работает, откройте окно Output и ищите исключения. Такие мелкие правки часто встречаются в реальном опыте создания Windows‑приложений.
Шаг 7. Публикация готового .exe
В решении кликните правой кнопкой → Опубликовать. Выберите профиль «Папка», укажите каталог, нажмите Опубликовать. В результате получите набор файлов, среди которых HabitTracker.exe. Теперь можно копировать приложение на любой ПК без установки Visual Studio.
Эти семь шагов полностью отвечают на вопрос, как работать с Windows Forms — создаем трекер привычек пошагово, и дают готовый продукт за пару часов.
Таблица сравнения подходов к хранению данных
| Метод | Требуемый код | Нагрузка на приложение | Нужна внешняя СУБД? |
|---|---|---|---|
| JSON‑файл | Newtonsoft.Json + File I/O | Низкая (меньше 10 KB для 100 записей) | Нет |
| SQLite | System.Data.SQLite + SQL‑запросы | Средняя (пакет ~300 KB) | Нет, но нужен движок |
| SQL Server Express | Entity 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‑подход рассчитан на одного пользователя.






