dem3/MaterialEditForm.cs
2025-11-18 17:27:48 +04:00

241 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Dem2
{
using System;
using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient; // Убедись, что установлен пакет MySql.Data
public partial class MaterialEditForm : Form
{
private int? materialIdToEdit = null;
public MaterialEditForm()
{
InitializeComponent();
LoadMaterialTypes(); // Загрузка типов при открытии формы
button1.Click += buttonSave_Click;
}
// Конструктор для редактирования
public MaterialEditForm(int materialId) : this()
{
materialIdToEdit = materialId;
}
private void MaterialEditForm_Load(object sender, EventArgs e)
{
if (materialIdToEdit.HasValue)
{
LoadMaterialData(); // Загрузка данных для редактирования
}
}
private void LoadMaterialTypes()
{
try
{
using (var conn = DataBase.GetConnection())
{
conn.Open();
string sql = "SELECT id, type_name FROM material_types ORDER BY type_name";
MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn);
DataTable dt = new DataTable();
adapter.Fill(dt);
comboBoxMaterialType.DataSource = dt;
comboBoxMaterialType.DisplayMember = "type_name";
comboBoxMaterialType.ValueMember = "id";
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки типов материалов: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Лучше не закрывать форму, если типы не загрузились, но можно и Close();
}
}
private void LoadMaterialData()
{
try
{
using (var conn = DataBase.GetConnection())
{
conn.Open();
string sql = @"
SELECT material_name, material_type_id, current_stock, unit, pack_size, min_stock, price_per_unit
FROM materials
WHERE id = @id";
using (var cmd = new MySqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@id", materialIdToEdit);
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
textBoxName.Text = reader["material_name"].ToString();
// Обработка возможного NULL в material_type_id
if (reader["material_type_id"] != DBNull.Value)
{
comboBoxMaterialType.SelectedValue = Convert.ToInt32(reader["material_type_id"]);
}
else
{
comboBoxMaterialType.SelectedIndex = -1; // или установить первый элемент
}
numericUpDownCurrentStock.Value = reader["current_stock"] != DBNull.Value ? Convert.ToDecimal(reader["current_stock"]) : 0;
textBoxUnit.Text = reader["unit"].ToString(); // может быть NULL -> ""
numericUpDownPackSize.Value = reader["pack_size"] != DBNull.Value ? Convert.ToDecimal(reader["pack_size"]) : 1; // по умолчанию 1
numericUpDownMinStock.Value = reader["min_stock"] != DBNull.Value ? Convert.ToDecimal(reader["min_stock"]) : 0;
numericUpDownPricePerUnit.Value = reader["price_per_unit"] != DBNull.Value ? Convert.ToDecimal(reader["price_per_unit"]) : 0;
}
else
{
MessageBox.Show("Материал с указанным ID не найден.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
this.DialogResult = DialogResult.Abort;
this.Close();
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки данных материала: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
// 1. Валидация
if (string.IsNullOrWhiteSpace(textBoxName.Text))
{
MessageBox.Show("Введите наименование материала.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBoxName.Focus();
return;
}
if (numericUpDownPricePerUnit.Value < 0)
{
MessageBox.Show("Цена не может быть отрицательной.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
numericUpDownPricePerUnit.Focus();
return;
}
if (numericUpDownMinStock.Value < 0)
{
MessageBox.Show("Минимальное количество не может быть отрицательным.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning);
numericUpDownMinStock.Focus();
return;
}
// 2. Подготовка данных
string name = textBoxName.Text.Trim();
int? typeId = null;
if (comboBoxMaterialType.SelectedValue != null && comboBoxMaterialType.SelectedValue != DBNull.Value)
{
typeId = Convert.ToInt32(comboBoxMaterialType.SelectedValue);
}
decimal currentStock = numericUpDownCurrentStock.Value;
string unit = textBoxUnit.Text.Trim();
decimal packSize = numericUpDownPackSize.Value;
decimal minStock = numericUpDownMinStock.Value;
decimal price = numericUpDownPricePerUnit.Value;
// 3. SQL
string sql;
if (materialIdToEdit.HasValue)
{
sql = @"
UPDATE materials
SET material_name = @name,
material_type_id = @typeId,
current_stock = @currentStock,
unit = @unit,
pack_size = @packSize,
min_stock = @minStock,
price_per_unit = @price
WHERE id = @id";
}
else
{
sql = @"
INSERT INTO materials (material_name, material_type_id, current_stock, unit, pack_size, min_stock, price_per_unit)
VALUES (@name, @typeId, @currentStock, @unit, @packSize, @minStock, @price)";
}
// 4. Выполнение
try
{
using (var conn = DataBase.GetConnection())
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
// Обязательно проверяй на DBNull.Value для nullable полей
cmd.Parameters.AddWithValue("@name", name);
cmd.Parameters.AddWithValue("@typeId", typeId.HasValue ? (object)typeId.Value : DBNull.Value);
cmd.Parameters.AddWithValue("@currentStock", currentStock);
cmd.Parameters.AddWithValue("@unit", string.IsNullOrEmpty(unit) ? (object)DBNull.Value : unit);
cmd.Parameters.AddWithValue("@packSize", packSize);
cmd.Parameters.AddWithValue("@minStock", minStock);
cmd.Parameters.AddWithValue("@price", price);
if (materialIdToEdit.HasValue)
{
cmd.Parameters.AddWithValue("@id", materialIdToEdit.Value);
}
int rowsAffected = cmd.ExecuteNonQuery();
if (rowsAffected > 0)
{
MessageBox.Show("Материал успешно сохранён.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.DialogResult = DialogResult.OK;
this.Close();
}
else
{
MessageBox.Show("Не удалось сохранить материал. Проверьте данные.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
catch (MySqlException sqlEx)
{
// Конкретная ошибка MySQL (например, нарушение уникальности, тип данных)
MessageBox.Show("Ошибка базы данных: " + sqlEx.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
// Любая другая ошибка
MessageBox.Show("Ошибка сохранения: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
}
}
}