Задание
Разработать приложение которое позволило бы вести учет выданных детских подарков. Для реализации проекта рекомендуется использовать высокоуровневый язык C# технологию создания оконных приложений - Windows Forms и базу данных SQL Server. Использовать ADO.NET - ЗАПРЕЩЕНО! РЕКОМЕНДУЕТСЯ - ENTITY FRAMEWORK!
Функционал программы
- Учет родителей и детей
- Учёт подарков и их выдачи
- Экспорт данных по выдаче в Excel
Фрагмент программного кода
using Giving_Out_GiftsApp.Data;
using Giving_Out_GiftsApp.Models;
using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;
namespace Giving_Out_GiftsApp.Windows
{
public partial class ExtraditionForm : Form
{
private AppDbContext context;
private List<Extradition> extraditions = new List<Extradition>();
private BindingSource extraditionsBindingSource = new BindingSource();
private BindingSource displayBindingSource = new BindingSource();
public ExtraditionForm()
{
InitializeComponent();
context = new AppDbContext();
}
private void Populate()
{
extraditions = context.Extraditions
.Include("Parent")
.Include("Kid")
.Include("GivingGifts.Gift")
.ToList();
extraditionsBindingSource.DataSource = new BindingList<Extradition>(extraditions);
var displayData = extraditions.Select(e => new
{
e.ExtraditionId,
ParentName = $"{e.Parent.FullName}",
KidName = $"{e.Kid.FullName}",
Gifts = string.Join(", ", e.GivingGifts.Select(ec => ec.Gift.Name)),
ExtraditionDate = e.ExtraditionDate.ToString("dd.MM.yyyy"),
}).ToList();
displayBindingSource.DataSource = displayData;
ExtraditionsDGV.DataSource = null;
ExtraditionsDGV.Columns.Clear();
ExtraditionsDGV.DataSource = displayBindingSource;
bindingNavigator1.BindingSource = displayBindingSource;
}
private void ExtraditionForm_Load(object sender, EventArgs e)
{
Populate();
extraditionsBindingSource.CurrentChanged += ExtraditionsBindingSource_CurrentChanged;
ParentCb.SelectedIndexChanged += ParentCb_SelectedIndexChanged;
// Загрузка родителей-сотрудников
var parents = context.Parents.ToList();
ParentCb.DataSource = parents;
ParentCb.DisplayMember = "FullName";
ParentCb.ValueMember = "ParentId";
// Загрузка детей
//var kids = context.Kids.ToList();
//KidCb.DataSource = kids;
//KidCb.DisplayMember = "FullName";
//KidCb.ValueMember = "KidId";
// Загрузка подарков
var gifts = context.Gifts.ToList();
GiftsLb.DataSource = gifts;
GiftsLb.DisplayMember = "Name";
GiftsLb.ValueMember = "GiftId";
}
private void ParentCb_SelectedIndexChanged(object sender, EventArgs e)
{
var parent = ParentCb.SelectedItem as Parent;
if (parent == null)
return;
int parentId = parent.ParentId;
var kids = context.ParentKids
.Where(pk => pk.ParentId == parentId)
.Select(pk => pk.Kid)
.Distinct()
.ToList();
KidCb.DataSource = kids;
KidCb.DisplayMember = "FullName";
KidCb.ValueMember = "KidId";
}
private void ExtraditionsBindingSource_CurrentChanged(object sender, EventArgs e)
{
if (extraditionsBindingSource.Current is Extradition selectedGiving)
{
// Устанавливаем родителя и ребенка
ParentCb.SelectedValue = selectedGiving.ParentId;
KidCb.SelectedValue = selectedGiving.KidId;
// Снимаем все выделения сначала
for (int i = 0; i < GiftsLb.Items.Count; i++)
GiftsLb.SetSelected(i, false);
// Устанавливаем выделения курсов
var selectedGiftIds = selectedGiving.GivingGifts.Select(ec => ec.GiftId).ToHashSet();
for (int i = 0; i < GiftsLb.Items.Count; i++)
{
if (GiftsLb.Items[i] is Gift gift && selectedGiftIds.Contains(gift.GiftId))
GiftsLb.SetSelected(i, true);
}
}
}
private void AddBtn_Click(object sender, EventArgs e)
{
if (ParentCb.SelectedValue == null ||KidCb.SelectedValue == null)
{
MessageBox.Show("Пожалуйста, выберите сотрудника и ребенка.");
return;
}
int parentId = (int)ParentCb.SelectedValue;
int kidId = (int)KidCb.SelectedValue;
if (GiftsLb.SelectedItems.Count == 0)
{
MessageBox.Show("Выберите хотя бы один подарок.");
return;
}
var extradition = new Extradition
{
ParentId = parentId,
KidId = kidId,
ExtraditionDate = DateTime.UtcNow,
GivingGifts = new List<GivingGift>()
};
foreach (Gift selectedGift in GiftsLb.SelectedItems)
{
extradition.GivingGifts.Add(new GivingGift
{
GiftId = selectedGift.GiftId
});
}
context.Extraditions.Add(extradition);
context.SaveChanges();
MessageBox.Show("Запись успешно добавлена.");
Populate();
}
private void EditBtn_Click(object sender, EventArgs e)
{
var current = extraditionsBindingSource.Current as Extradition;
if (current == null)
{
MessageBox.Show("Выберите запись для редактирования.");
return;
}
var extradition = context.Extraditions
.FirstOrDefault(en => en.ExtraditionId == current.ExtraditionId);
if (extradition == null)
{
MessageBox.Show("Запись не найдена.");
return;
}
extradition.ParentId = (int)ParentCb.SelectedValue;
extradition.KidId = (int)KidCb.SelectedValue;
extradition.ExtraditionDate = ExtraditionDateDtp.Value;
// Удаление старых связей
var existingGifts = context.GivingGifts
.Where(ec => ec.ExtraditionId == extradition.ExtraditionId);
context.GivingGifts.RemoveRange(existingGifts);
// Добавление новых
foreach (Gift selectedGigt in GiftsLb.SelectedItems)
{
context.GivingGifts.Add(new GivingGift
{
ExtraditionId = extradition.ExtraditionId,
GiftId = selectedGigt.GiftId
});
}
context.SaveChanges();
MessageBox.Show("Запись обновлена.");
Populate();
}
private void DeleteBtn_Click(object sender, EventArgs e)
{
var current = extraditionsBindingSource.Current as Extradition;
if (current == null)
{
MessageBox.Show("Выберите запись для удаления.");
return;
}
var confirm = MessageBox.Show("Удалить запись?", "Подтверждение", MessageBoxButtons.YesNo);
if (confirm != DialogResult.Yes)
return;
var extradition = context.Extraditions
.FirstOrDefault(en => en.ExtraditionId == current.ExtraditionId);
if (extradition != null)
{
var relatedGifts = context.GivingGifts
.Where(ec => ec.ExtraditionId == extradition.ExtraditionId);
context.GivingGifts.RemoveRange(relatedGifts);
context.Extraditions.Remove(extradition);
context.SaveChanges();
MessageBox.Show("Запись удалена.");
Populate();
}
}
private void ClosedBtn_Click(object sender, EventArgs e)
{
Close();
}
private void ExtraditionsDGV_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0 && e.RowIndex < extraditions.Count)
{
extraditionsBindingSource.Position = e.RowIndex;
ExtraditionsBindingSource_CurrentChanged(null, null);
}
}
private void ExportBtn_Click(object sender, EventArgs e)
{
using (SaveFileDialog sfd = new SaveFileDialog()
{
Filter = "Excel Workbook|*.xlsx",
Title = "Сохранить как Excel файл"
})
{
if (sfd.ShowDialog() == DialogResult.OK)
{
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("Курсы");
// Заголовки
for (int i = 0; i < ExtraditionsDGV.Columns.Count; i++)
{
worksheet.Cell(1, i + 1).Value = ExtraditionsDGV.Columns[i].HeaderText;
}
// Данные
for (int i = 0; i < ExtraditionsDGV.Rows.Count; i++)
{
for (int j = 0; j < ExtraditionsDGV.Columns.Count; j++)
{
worksheet.Cell(i + 2, j + 1).Value = ExtraditionsDGV.Rows[i].Cells[j].Value?.ToString();
}
}
workbook.SaveAs(sfd.FileName);
MessageBox.Show("Экспорт завершён!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
}
}
Скриншот архива с проектом

Пояснения по запуску программы
1. Устанавливаем Visual Studio 2026 Community 2. SSMS также устанавливаем. 3. Запускаем проект - удаляем папку миграций - создаем их заново командами в консоли диспетчера пакетов - Enable Migrations - Add-Migration InitialCreate - Update Database. 4. хмакаем зеленую кнопку вверху на панели - наслаждаемся использованием.
Телеграм
-