ProductListForm.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using System.ComponentModel;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. namespace ToyStoreApp;
  5. public sealed partial class ProductListForm : Form
  6. {
  7. private readonly DatabaseClient _db;
  8. private readonly AppUser _user;
  9. private readonly BindingList<ProductView> _products = [];
  10. private ProductEditForm? _productEditForm;
  11. public ProductListForm(DatabaseClient db, AppUser user)
  12. {
  13. _db = db;
  14. _user = user;
  15. InitializeComponent();
  16. Text = $"{AppearanceSettings.ProductListTitle} - {_user.FullName} ({_user.RoleName})";
  17. userInfoLabel.Text = $"Пользователь: {_user.FullName}\r\nРоль: {_user.RoleName}";
  18. searchTextBox.Enabled = _user.CanSearch;
  19. searchFieldComboBox.Enabled = _user.CanSearch;
  20. addButton.Enabled = _user.CanEditProducts;
  21. editButton.Enabled = _user.CanEditProducts;
  22. deleteButton.Enabled = _user.CanEditProducts;
  23. ordersButton.Enabled = _user.CanViewOrders;
  24. }
  25. private void ProductListForm_Load(object? sender, EventArgs e)
  26. {
  27. ProductsBindingGrid.DataSource = _products;
  28. LoadFilters();
  29. Reload();
  30. }
  31. private void SearchTextBox_TextChanged(object? sender, EventArgs e) => Reload();
  32. private void SearchFieldComboBox_SelectedIndexChanged(object? sender, EventArgs e) => Reload();
  33. private void SupplierComboBox_SelectedIndexChanged(object? sender, EventArgs e) => Reload();
  34. private void SortComboBox_SelectedIndexChanged(object? sender, EventArgs e) => Reload();
  35. private void AddButton_Click(object? sender, EventArgs e) => EditProduct(null);
  36. private void EditButton_Click(object? sender, EventArgs e) => EditProduct(SelectedProduct());
  37. private void DeleteButton_Click(object? sender, EventArgs e) => DeleteSelected();
  38. private void OrdersButton_Click(object? sender, EventArgs e)
  39. {
  40. using var form = new OrderListForm(_db, _user);
  41. form.ShowDialog(this);
  42. }
  43. private void ExitButton_Click(object? sender, EventArgs e) => Close();
  44. private void ProductsGrid_RowPrePaint(object? sender, DataGridViewRowPrePaintEventArgs e) => PaintRow(e.RowIndex);
  45. private void ProductsGrid_CellDoubleClick(object? sender, DataGridViewCellEventArgs e)
  46. {
  47. if (e.RowIndex < 0 || SelectedProduct() is not ProductView product)
  48. {
  49. return;
  50. }
  51. using var form = new ProductDetailsForm(product);
  52. form.ShowDialog(this);
  53. }
  54. private void LoadFilters()
  55. {
  56. supplierComboBox.Items.Clear();
  57. supplierComboBox.Items.Add("Все поставщики");
  58. foreach (var supplier in _db.LoadSuppliers())
  59. {
  60. supplierComboBox.Items.Add(supplier);
  61. }
  62. supplierComboBox.SelectedIndex = 0;
  63. }
  64. private void Reload()
  65. {
  66. if (searchFieldComboBox.SelectedItem is null || supplierComboBox.SelectedItem is null || sortComboBox.SelectedItem is null)
  67. {
  68. return;
  69. }
  70. _products.Clear();
  71. foreach (var product in _db.LoadProducts(searchTextBox.Text.Trim(), searchFieldComboBox.Text, supplierComboBox.Text, sortComboBox.Text))
  72. {
  73. _products.Add(product);
  74. }
  75. countStatusLabel.Text = $"Товаров: {_products.Count}";
  76. }
  77. private ProductView? SelectedProduct()
  78. {
  79. return ProductsBindingGrid.CurrentRow?.DataBoundItem as ProductView;
  80. }
  81. private void EditProduct(ProductView? product)
  82. {
  83. if (_productEditForm is not null && !_productEditForm.IsDisposed)
  84. {
  85. _productEditForm.Activate();
  86. return;
  87. }
  88. using var form = new ProductEditForm(_db, product);
  89. _productEditForm = form;
  90. try
  91. {
  92. if (form.ShowDialog(this) == DialogResult.OK)
  93. {
  94. LoadFilters();
  95. Reload();
  96. }
  97. }
  98. finally
  99. {
  100. _productEditForm = null;
  101. }
  102. }
  103. private void DeleteSelected()
  104. {
  105. var product = SelectedProduct();
  106. if (product is null)
  107. {
  108. return;
  109. }
  110. if (_db.ProductIsUsedInOrders(product.ProductId))
  111. {
  112. MessageBox.Show("Товар присутствует в заказе, удалить его нельзя.", "Удаление запрещено", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  113. return;
  114. }
  115. if (MessageBox.Show("Удалить выбранный товар?", "Подтверждение", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes)
  116. {
  117. return;
  118. }
  119. _db.DeleteProduct(product.ProductId);
  120. Reload();
  121. }
  122. private void PaintRow(int rowIndex)
  123. {
  124. if (rowIndex < 0 || rowIndex >= ProductsBindingGrid.Rows.Count)
  125. {
  126. return;
  127. }
  128. if (ProductsBindingGrid.Rows[rowIndex].DataBoundItem is not ProductView product)
  129. {
  130. return;
  131. }
  132. ProductsBindingGrid.Rows[rowIndex].DefaultCellStyle.BackColor =
  133. product.StockQuantity == 0 ? Color.LightBlue :
  134. product.DiscountPercent > AppearanceSettings.DiscountHighlightThresholdPercent ? ColorTranslator.FromHtml(AppearanceSettings.DiscountHighlightColor) :
  135. Color.White;
  136. }
  137. }