diff --git a/FoodOrders/FoodOrdersContracts/Attributes/ColumnAttribute.cs b/FoodOrders/FoodOrdersContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..ac1b9d3 --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public string Title { get; private set; } + + public bool Visible { get; private set; } + + public int Width { get; private set; } + + public GridViewAutoSize GridViewAutoSize { get; private set; } + + public bool IsUseAutoSize { get; private set; } + + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + } +} diff --git a/FoodOrders/FoodOrdersContracts/Attributes/GridViewAutoSize.cs b/FoodOrders/FoodOrdersContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..a75d2dd --- /dev/null +++ b/FoodOrders/FoodOrdersContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + + None = 1, + + ColumnHeader = 2, + + AllCellsExceptHeader = 4, + + AllCells = 6, + + DisplayedCellsExceptHeader = 8, + + DisplayedCells = 10, + + Fill = 16 + } +} diff --git a/FoodOrders/FoodOrdersContracts/ViewModels/ClientViewModel.cs b/FoodOrders/FoodOrdersContracts/ViewModels/ClientViewModel.cs index a655f40..a8d71ff 100644 --- a/FoodOrders/FoodOrdersContracts/ViewModels/ClientViewModel.cs +++ b/FoodOrders/FoodOrdersContracts/ViewModels/ClientViewModel.cs @@ -1,17 +1,17 @@ -using FoodOrdersDataModel.Models; +using FoodOrdersContracts.Attributes; +using FoodOrdersDataModel.Models; using System.ComponentModel; namespace FoodOrdersContracts.ViewModels { public class ClientViewModel : IClientModel - { - public int Id { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; - - [DisplayName("логин (эл.почта)")] - public string Email { get; set; } = string.Empty; - - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; - } + { + [Column(visible: false)] + public int Id { get; set; } + [Column(title: "Имя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column(title: "Логин (эл. почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Email { get; set; } = string.Empty; + [Column(title: "Пароль", width: 150)] + public string Password { get; set; } = string.Empty; + } } diff --git a/FoodOrders/FoodOrdersView/DataGridViewExtension.cs b/FoodOrders/FoodOrdersView/DataGridViewExtension.cs new file mode 100644 index 0000000..dfd4cac --- /dev/null +++ b/FoodOrders/FoodOrdersView/DataGridViewExtension.cs @@ -0,0 +1,51 @@ +using FoodOrdersContracts.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FoodOrdersView +{ + internal static class DataGridViewExtension + { + public static void FillAndConfigGrid(this DataGridView grid, List? data) + { + if (data == null) + { + return; + } + grid.DataSource = data; + + var type = typeof(T); + var properties = type.GetProperties(); + foreach (DataGridViewColumn column in grid.Columns) + { + var property = properties.FirstOrDefault(x => x.Name == column.Name); + if (property == null) + { + throw new InvalidOperationException($"В типе {type.Name} не найдено свойство с именем {column.Name}"); + } + var attribute = property.GetCustomAttributes(typeof(ColumnAttribute), true)?.SingleOrDefault(); + if (attribute == null) + { + throw new InvalidOperationException($"Не найден атрибут типа ColumnAttribute для свойства {property.Name}"); + } + // ищем нужный нам атрибут + if (attribute is ColumnAttribute columnAttr) + { + column.HeaderText = columnAttr.Title; + column.Visible = columnAttr.Visible; + if (columnAttr.IsUseAutoSize) + { + column.AutoSizeMode = (DataGridViewAutoSizeColumnMode)Enum.Parse(typeof(DataGridViewAutoSizeColumnMode), columnAttr.GridViewAutoSize.ToString()); + } + else + { + column.Width = columnAttr.Width; + } + } + } + } + } +} diff --git a/FoodOrders/FoodOrdersView/FormClients.cs b/FoodOrders/FoodOrdersView/FormClients.cs index d5de1bf..a92371c 100644 --- a/FoodOrders/FoodOrdersView/FormClients.cs +++ b/FoodOrders/FoodOrdersView/FormClients.cs @@ -30,23 +30,17 @@ namespace FoodOrdersView } private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка клиентов"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки клиентов"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + try + { + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки клиентов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } private void ButtonDel_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) diff --git a/FoodOrders/FoodOrdersView/FormComponents.cs b/FoodOrders/FoodOrdersView/FormComponents.cs index e4c5ee5..18147bc 100644 --- a/FoodOrders/FoodOrdersView/FormComponents.cs +++ b/FoodOrders/FoodOrdersView/FormComponents.cs @@ -22,17 +22,10 @@ logic) private void LoadData() { try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView1.DataSource = list; - dataGridView1.Columns["Id"].Visible = false; - dataGridView1.Columns["ComponentName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка компонентов"); - } + { + dataGridView1.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка компонентов"); + } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки компонентов"); diff --git a/FoodOrders/FoodOrdersView/FormFoods.cs b/FoodOrders/FoodOrdersView/FormFoods.cs index df2f49c..7c5cb37 100644 --- a/FoodOrders/FoodOrdersView/FormFoods.cs +++ b/FoodOrders/FoodOrdersView/FormFoods.cs @@ -34,20 +34,12 @@ namespace FoodOrdersView private void LoadData() { try - { - var list = _logic.ReadList(null); + { + dataGridView1.FillAndConfigGrid(_logic.ReadList(null)); - if (list != null) - { - dataGridView1.DataSource = list; - dataGridView1.Columns["Id"].Visible = false; - dataGridView1.Columns["FoodName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["FoodComponents"].Visible = false; - } + _logger.LogInformation("Загрузка изделий"); - _logger.LogInformation("Загрузка изделий"); - - } + } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки изделий"); diff --git a/FoodOrders/FoodOrdersView/FormImplementers.cs b/FoodOrders/FoodOrdersView/FormImplementers.cs index 39cf8ba..6eea5ae 100644 --- a/FoodOrders/FoodOrdersView/FormImplementers.cs +++ b/FoodOrders/FoodOrdersView/FormImplementers.cs @@ -33,14 +33,7 @@ namespace FoodOrdersView { try { - var list = _logic.ReadList(null); - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["Id"].Visible = false; - DataGridView.Columns["ImplementerFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } + DataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка исполнителей"); } catch (Exception ex)