From 8a61dd2832f639c85bcbfb5823196480850155a8 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 15:57:59 +0400 Subject: [PATCH] data grid view new --- .../IceCreamShop/DataGridViewExtension.cs | 46 +++++++++++++++++++ IceCreamShop/IceCreamShop/FormClients.cs | 29 +++++------- IceCreamShop/IceCreamShop/FormComponents.cs | 29 +++++------- IceCreamShop/IceCreamShop/FormIceCreams.cs | 30 +++++------- IceCreamShop/IceCreamShop/FormImplementers.cs | 30 +++++------- IceCreamShop/IceCreamShop/FormMain.cs | 9 +--- IceCreamShop/IceCreamShop/FormViewMail.cs | 9 +--- .../ViewModels/ClientViewModel.cs | 21 ++++----- .../ViewModels/ComponentViewModel.cs | 16 ++++--- .../ViewModels/IceCreamViewModel.cs | 18 +++++--- .../ViewModels/ImplementerViewModel.cs | 22 +++++---- .../ViewModels/MessageInfoViewModel.cs | 27 ++++++----- .../ViewModels/OrderViewModel.cs | 45 ++++++++++-------- 13 files changed, 181 insertions(+), 150 deletions(-) create mode 100644 IceCreamShop/IceCreamShop/DataGridViewExtension.cs diff --git a/IceCreamShop/IceCreamShop/DataGridViewExtension.cs b/IceCreamShop/IceCreamShop/DataGridViewExtension.cs new file mode 100644 index 0000000..a43d144 --- /dev/null +++ b/IceCreamShop/IceCreamShop/DataGridViewExtension.cs @@ -0,0 +1,46 @@ +using IceCreamShopContracts.Attributes; + +namespace IceCreamShopView +{ + 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/IceCreamShop/IceCreamShop/FormClients.cs b/IceCreamShop/IceCreamShop/FormClients.cs index 7d0673d..69f8df6 100644 --- a/IceCreamShop/IceCreamShop/FormClients.cs +++ b/IceCreamShop/IceCreamShop/FormClients.cs @@ -23,23 +23,18 @@ namespace IceCreamShopView 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) { diff --git a/IceCreamShop/IceCreamShop/FormComponents.cs b/IceCreamShop/IceCreamShop/FormComponents.cs index 565e1b2..1187925 100644 --- a/IceCreamShop/IceCreamShop/FormComponents.cs +++ b/IceCreamShop/IceCreamShop/FormComponents.cs @@ -33,23 +33,18 @@ namespace IceCreamShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ComponentName"].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 buttonAdd_Click(object sender, EventArgs e) { diff --git a/IceCreamShop/IceCreamShop/FormIceCreams.cs b/IceCreamShop/IceCreamShop/FormIceCreams.cs index bf71cd7..869e891 100644 --- a/IceCreamShop/IceCreamShop/FormIceCreams.cs +++ b/IceCreamShop/IceCreamShop/FormIceCreams.cs @@ -33,24 +33,18 @@ namespace IceCreamShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["IceCreamName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["IceCreamComponents"].Visible = false; - } - _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 buttonAdd_Click(object sender, EventArgs e) { diff --git a/IceCreamShop/IceCreamShop/FormImplementers.cs b/IceCreamShop/IceCreamShop/FormImplementers.cs index 3f68360..4d27954 100644 --- a/IceCreamShop/IceCreamShop/FormImplementers.cs +++ b/IceCreamShop/IceCreamShop/FormImplementers.cs @@ -24,24 +24,18 @@ namespace IceCreamShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ImplementerFIO"].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 ButtonAdd_Click(object sender, EventArgs e) { diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs index 158f01d..13c3116 100644 --- a/IceCreamShop/IceCreamShop/FormMain.cs +++ b/IceCreamShop/IceCreamShop/FormMain.cs @@ -41,14 +41,7 @@ namespace IceCreamShopView _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["IceCreamId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - } + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) diff --git a/IceCreamShop/IceCreamShop/FormViewMail.cs b/IceCreamShop/IceCreamShop/FormViewMail.cs index a802c58..8c4820b 100644 --- a/IceCreamShop/IceCreamShop/FormViewMail.cs +++ b/IceCreamShop/IceCreamShop/FormViewMail.cs @@ -19,14 +19,7 @@ namespace IceCreamShopView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["MessageId"].Visible = false; - dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка списка писем"); } catch (Exception ex) diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs index 19a404a..64674b6 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs @@ -1,19 +1,18 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System.ComponentModel; namespace IceCreamShopContracts.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("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column("Логин (эл. почта)", width: 150)] + public string Email { get; set; } = string.Empty; + [Column("Пароль", width: 150)] + public string Password { get; set; } = string.Empty; + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs index ba6e0cd..d577aa7 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs @@ -5,16 +5,20 @@ using System.Text; using System.Threading.Tasks; using AbstractIceCreamShopDataModels.Models; using System.ComponentModel; +using IceCreamShopContracts.Attributes; namespace IceCreamShopContracts.ViewModels { public class ComponentViewModel : IComponentModel { - public int Id { get; set; } - [DisplayName("Название компонента")] - public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Cost { get; set; } - } + [Column(visible: false)] + public int Id { get; set; } + + [Column("Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ComponentName { get; set; } = string.Empty; + + [Column("Цена", width: 80)] + public double Cost { get; set; } + } } diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs index 917c91e..8e98dcf 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs @@ -1,4 +1,5 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,11 +11,16 @@ namespace IceCreamShopContracts.ViewModels { public class IceCreamViewModel : IIceCreamModel { - public int Id { get; set; } - [DisplayName("Название мороженого")] - public string IceCreamName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Price { get; set; } - public Dictionary IceCreamComponents { get; set; } = new(); + [Column(visible: false)] + public int Id { get; set; } + + [Column("Название мороженого", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string IceCreamName { get; set; } = string.Empty; + + [Column("Цена", width: 100)] + public double Price { get; set; } + + [Column(visible: false)] + public Dictionary IceCreamComponents { get; set; } = new(); } } diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs index 8c1147b..f010552 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs @@ -1,22 +1,24 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System.ComponentModel; namespace IceCreamShopContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column("Пароль", width: 150)] + public string Password { get; set; } = string.Empty; - [DisplayName("Стаж работы")] - public int WorkExperience { get; set; } + [Column("Стаж работы", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int WorkExperience { get; set; } - [DisplayName("Квалификация")] - public int Qualification { get; set; } - } + [Column("Квалификация", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Qualification { get; set; } + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs index c4e4a23..627d1d0 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs @@ -1,24 +1,29 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System.ComponentModel; namespace IceCreamShopContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public string MessageId { get; set; } = string.Empty; - public int? ClientId { get; set; } + [Column(visible: false)] + public int? ClientId { get; set; } - [DisplayName("Отправитель")] - public string SenderName { get; set; } = string.Empty; + [Column("Отправитель", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] + public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] - public DateTime DateDelivery { get; set; } + [Column("Дата письма", width: 100)] + public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] - public string Subject { get; set; } = string.Empty; + [Column("Заголовок", width: 150)] + public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] - public string Body { get; set; } = string.Empty; - } + [Column("Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Body { get; set; } = string.Empty; + + [Column(visible: false)] + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs index b5d9404..a173759 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs @@ -1,5 +1,6 @@ using AbstractIceCreamShopDataModels.Enums; using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System; using System.Collections.Generic; using System.ComponentModel; @@ -11,36 +12,40 @@ namespace IceCreamShopContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] - public int Id { get; set; } + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Id { get; set; } - public int IceCreamId { get; set; } + [Column(visible: false)] + public int IceCreamId { get; set; } - [DisplayName("Название")] - public string IceCreamName { get; set; } = string.Empty; + [Column("Мороженое", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string IceCreamName { get; set; } = string.Empty; - public int ClientId { get; set; } + [Column(visible: false)] + public int ClientId { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column(visible: false)] public int? ImplementerId { get; set; } - [DisplayName("Фамилия исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Сумма")] - public double Sum { get; set; } + [Column("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } + [Column("Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; + + [Column("Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } } }