44 lines
1.5 KiB
C#
44 lines
1.5 KiB
C#
using DinerContracts.Attributes;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace DinerView {
|
||
internal static class DataGridViewExtension {
|
||
public static void FillAndConfigGrid<T>(this DataGridView grid, List<T>? 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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|