Загрузка данных
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using VasilisaSalon.Models;
namespace VasilisaSalon
{
public partial class Form1 : Form
{
private class ClientItem
{
public int ClientId { get; set; }
public string FullName { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public bool IsNew { get; set; }
}
private class EmployeeItem
{
public int EmployeeId { get; set; }
public string FullName { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public string PositionName { get; set; }
public int PositionId { get; set; }
public bool IsNew { get; set; }
}
private class MaterialItem
{
public int MaterialId { get; set; }
public string MaterialName { get; set; }
public string UnitName { get; set; }
public int UnitId { get; set; }
public int StockQty { get; set; }
public int MinStockQty { get; set; }
public bool IsNew { get; set; }
}
private List<ClientItem> clients = new List<ClientItem>();
private List<EmployeeItem> employees = new List<EmployeeItem>();
private List<MaterialItem> materials = new List<MaterialItem>();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
LoadClients();
LoadEmployees();
LoadMaterials();
cmbSort.Items.AddRange(new[] { "По ФИО", "По телефону" });
cmbSort.SelectedIndex = 0;
txtSearch.TextChanged += Search_Changed;
cmbSort.SelectedIndexChanged += Search_Changed;
SaveButton.Visible = false;
CancelButton.Visible = false;
}
// ============================================================
// ЗАГРУЗКА
// ============================================================
private void LoadClients()
{
try
{
using (var db = new VasilisaSalonEntities())
{
clients = db.client.ToList().Select(c => new ClientItem
{
ClientId = c.client_id,
FullName = c.full_name,
Phone = c.phone,
Email = c.email ?? "",
IsNew = false
}).ToList();
}
RefreshClientsGrid();
}
catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
}
private void LoadEmployees()
{
try
{
using (var db = new VasilisaSalonEntities())
{
employees = db.employee.Include("position_ref").ToList()
.Select(e => new EmployeeItem
{
EmployeeId = e.employee_id,
FullName = e.full_name,
Phone = e.phone,
Email = e.email ?? "",
PositionName = e.position_ref?.position_name ?? "",
PositionId = e.position_id,
IsNew = false
}).ToList();
}
RefreshEmployeesGrid();
}
catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
}
private void LoadMaterials()
{
try
{
using (var db = new VasilisaSalonEntities())
{
materials = db.material.Include("unit_ref").ToList()
.Select(m => new MaterialItem
{
MaterialId = m.material_id,
MaterialName = m.material_name,
UnitName = m.unit_ref?.unit_name ?? "",
UnitId = m.unit_id,
StockQty = m.stock_qty,
MinStockQty = m.min_stock_qty,
IsNew = false
}).ToList();
}
RefreshMaterialsGrid();
}
catch (Exception ex) { MessageBox.Show("Ошибка: " + ex.Message); }
}
// ============================================================
// ОТОБРАЖЕНИЕ
// ============================================================
private void RefreshClientsGrid()
{
dataGridViewClients.DataSource = null;
dataGridViewClients.DataSource = clients;
dataGridViewClients.AutoGenerateColumns = false;
if (dataGridViewClients.Columns.Count == 0)
{
dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "ClientId", HeaderText = "ID", ReadOnly = true, Width = 40 });
dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "FullName", HeaderText = "ФИО", Width = 220 });
dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Phone", HeaderText = "Телефон", Width = 140 });
dataGridViewClients.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Email", HeaderText = "Email", Width = 180 });
}
}
private void RefreshEmployeesGrid()
{
dataGridViewEmployees.DataSource = null;
dataGridViewEmployees.DataSource = employees;
dataGridViewEmployees.AutoGenerateColumns = false;
if (dataGridViewEmployees.Columns.Count == 0)
{
dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "EmployeeId", HeaderText = "ID", ReadOnly = true, Width = 40 });
dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "FullName", HeaderText = "ФИО", Width = 220 });
dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Phone", HeaderText = "Телефон", Width = 140 });
dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Email", HeaderText = "Email", Width = 180 });
dataGridViewEmployees.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "PositionName", HeaderText = "Должность", ReadOnly = true, Width = 140 });
}
}
private void RefreshMaterialsGrid()
{
dataGridViewMaterials.DataSource = null;
dataGridViewMaterials.DataSource = materials;
dataGridViewMaterials.AutoGenerateColumns = false;
if (dataGridViewMaterials.Columns.Count == 0)
{
dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "MaterialId", HeaderText = "ID", ReadOnly = true, Width = 40 });
dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "MaterialName", HeaderText = "Название", Width = 220 });
dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "UnitName", HeaderText = "Единица", ReadOnly = true, Width = 80 });
dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "StockQty", HeaderText = "Остаток", Width = 80 });
dataGridViewMaterials.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "MinStockQty", HeaderText = "Минимум", Width = 80 });
}
}
// ============================================================
// ПОИСК И СОРТИРОВКА
// ============================================================
private void Search_Changed(object sender, EventArgs e)
{
string search = txtSearch.Text.Trim().ToLower();
string sort = cmbSort.SelectedItem?.ToString();
if (tabControl1.SelectedTab == tabClients)
{
var f = clients.AsEnumerable();
if (!string.IsNullOrEmpty(search))
f = f.Where(c => c.FullName.ToLower().Contains(search) || c.Phone.Contains(search));
if (sort == "По ФИО") f = f.OrderBy(c => c.FullName);
else if (sort == "По телефону") f = f.OrderBy(c => c.Phone);
dataGridViewClients.DataSource = f.ToList();
}
else if (tabControl1.SelectedTab == tabEmployees)
{
var f = employees.AsEnumerable();
if (!string.IsNullOrEmpty(search))
f = f.Where(c => c.FullName.ToLower().Contains(search) || c.Phone.Contains(search));
if (sort == "По ФИО") f = f.OrderBy(c => c.FullName);
else if (sort == "По телефону") f = f.OrderBy(c => c.Phone);
dataGridViewEmployees.DataSource = f.ToList();
}
else if (tabControl1.SelectedTab == tabMaterials)
{
var f = materials.AsEnumerable();
if (!string.IsNullOrEmpty(search))
f = f.Where(c => c.MaterialName.ToLower().Contains(search));
dataGridViewMaterials.DataSource = f.ToList();
}
}
// ============================================================
// ДОБАВИТЬ / УДАЛИТЬ
// ============================================================
private void btnAdd_Click(object sender, EventArgs e)
{
if (tabControl1.SelectedTab == tabClients)
{
clients.Add(new ClientItem { ClientId = -1, FullName = "Новый клиент", Phone = "+7", Email = "", IsNew = true });
RefreshClientsGrid();
}
else if (tabControl1.SelectedTab == tabEmployees)
{
employees.Add(new EmployeeItem { EmployeeId = -1, FullName = "Новый сотрудник", Phone = "+7", Email = "", PositionName = "", PositionId = 1, IsNew = true });
RefreshEmployeesGrid();
}
else if (tabControl1.SelectedTab == tabMaterials)
{
materials.Add(new MaterialItem { MaterialId = -1, MaterialName = "Новый материал", UnitName = "шт", UnitId = 3, StockQty = 0, MinStockQty = 0, IsNew = true });
RefreshMaterialsGrid();
}
ShowSaveButtons();
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (tabControl1.SelectedTab == tabClients)
{
if (dataGridViewClients.CurrentRow == null) return;
var item = dataGridViewClients.CurrentRow.DataBoundItem as ClientItem;
if (item != null) { clients.Remove(item); RefreshClientsGrid(); ShowSaveButtons(); }
}
else if (tabControl1.SelectedTab == tabEmployees)
{
if (dataGridViewEmployees.CurrentRow == null) return;
var item = dataGridViewEmployees.CurrentRow.DataBoundItem as EmployeeItem;
if (item != null) { employees.Remove(item); RefreshEmployeesGrid(); ShowSaveButtons(); }
}
else if (tabControl1.SelectedTab == tabMaterials)
{
if (dataGridViewMaterials.CurrentRow == null) return;
var item = dataGridViewMaterials.CurrentRow.DataBoundItem as MaterialItem;
if (item != null) { materials.Remove(item); RefreshMaterialsGrid(); ShowSaveButtons(); }
}
}
// ============================================================
// СОХРАНЕНИЕ
// ============================================================
private void ShowSaveButtons()
{
SaveButton.Visible = true;
CancelButton.Visible = true;
}
private void SaveButton_Click(object sender, EventArgs e)
{
try
{
dataGridViewClients.EndEdit();
dataGridViewEmployees.EndEdit();
dataGridViewMaterials.EndEdit();
using (var db = new VasilisaSalonEntities())
{
// клиенты
foreach (var item in clients)
{
if (item.IsNew)
{
db.client.Add(new client
{
full_name = item.FullName,
phone = item.Phone,
email = item.Email,
reg_date = DateTime.Now,
pd_consent = true
});
}
else
{
var dbItem = db.client.Find(item.ClientId);
if (dbItem != null)
{
dbItem.full_name = item.FullName;
dbItem.phone = item.Phone;
dbItem.email = item.Email;
}
}
}
// удалённые клиенты
var clientIds = clients.Where(c => !c.IsNew).Select(c => c.ClientId).ToList();
foreach (var dbItem in db.client.ToList())
if (!clientIds.Contains(dbItem.client_id))
db.client.Remove(dbItem);
// сотрудники
foreach (var item in employees)
{
if (item.IsNew)
{
db.employee.Add(new employee
{
full_name = item.FullName,
phone = item.Phone,
email = item.Email,
position_id = item.PositionId,
hire_date = DateTime.Now,
is_active = true
});
}
else
{
var dbItem = db.employee.Find(item.EmployeeId);
if (dbItem != null)
{
dbItem.full_name = item.FullName;
dbItem.phone = item.Phone;
dbItem.email = item.Email;
}
}
}
// удалённые сотрудники
var empIds = employees.Where(e => !e.IsNew).Select(e => e.EmployeeId).ToList();
foreach (var dbItem in db.employee.ToList())
if (!empIds.Contains(dbItem.employee_id))
db.employee.Remove(dbItem);
// расходники
foreach (var item in materials)
{
if (item.IsNew)
{
db.material.Add(new material
{
material_name = item.MaterialName,
unit_id = item.UnitId,
stock_qty = item.StockQty,
min_stock_qty = item.MinStockQty
});
}
else
{
var dbItem = db.material.Find(item.MaterialId);
if (dbItem != null)
{
dbItem.material_name = item.MaterialName;
dbItem.stock_qty = item.StockQty;
dbItem.min_stock_qty = item.MinStockQty;
}
}
}
// удалённые расходники
var matIds = materials.Where(m => !m.IsNew).Select(m => m.MaterialId).ToList();
foreach (var dbItem in db.material.ToList())
if (!matIds.Contains(dbItem.material_id))
db.material.Remove(dbItem);
db.SaveChanges();
}
LoadClients();
LoadEmployees();
LoadMaterials();
SaveButton.Visible = false;
CancelButton.Visible = false;
MessageBox.Show("Сохранено!");
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + (ex.InnerException?.Message ?? ex.Message));
}
}
private void CancelButton_Click(object sender, EventArgs e)
{
LoadClients();
LoadEmployees();
LoadMaterials();
SaveButton.Visible = false;
CancelButton.Visible = false;
}
private void txtSearch_TextChanged(object sender, EventArgs e)
{
Search_Changed(sender, e);
}
private void cmbSort_SelectedIndexChanged(object sender, EventArgs e)
{
Search_Changed(sender, e);
}
}
}