KOP/Components/UserControlTable.cs
2024-10-03 23:14:26 +04:00

101 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormsLibrary1
{
public partial class UserControlTable : UserControl
{
public int index
{
get => dataGridViewTable.SelectedRows.Count > 0 ? dataGridViewTable.SelectedRows[0].Index : -1;
set
{
if (value >= 0 && value < dataGridViewTable.Rows.Count)
{
dataGridViewTable.ClearSelection();
dataGridViewTable.Rows[value].Selected = true;
}
}
}
public UserControlTable()
{
InitializeComponent();
}
public void ConfigureColumns(List<ColumnInfo> columnInfo)
{
dataGridViewTable.Columns.Clear();
for (int i = 0; i < columnInfo.Count; i++)
{
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn
{
Name = columnInfo[i].Name,
HeaderText = columnInfo[i].HeaderText,
Width = columnInfo[i].Width,
Visible = columnInfo[i].Visible,
};
dataGridViewTable.Columns.Add(column);
}
}
public void ClearRows()
{
dataGridViewTable.Rows.Clear();
}
public void AddObjectList(List<object> os)
{
dataGridViewTable.DataSource = os ?? throw new ArgumentNullException();
}
public T GetObjectFromRow<T>()
where T : new()
{
if (dataGridViewTable.SelectedRows.Count == 0)
{
throw new InvalidOperationException("At least one row must be selected");
}
T returnObject = new();
var selectedRow = dataGridViewTable.SelectedRows[0];
var props = typeof(T).GetProperties();
var cells = dataGridViewTable.Rows[selectedRow.Index].Cells;
for (int i = 0; i < dataGridViewTable.ColumnCount; i++)
{
var curCell = cells[i];
var prop = props.FirstOrDefault(x => x.Name == dataGridViewTable.Columns[i].Name);
prop?.SetValue(returnObject, curCell.Value);
}
return returnObject;
}
public void AddList<T> (List<T> values)
{
ClearRows();
var props = typeof(T).GetProperties();
foreach (T value in values)
{
int newRowInd = dataGridViewTable.Rows.Add(value);
foreach (DataGridViewColumn col in dataGridViewTable.Columns)
{
var prop = props.FirstOrDefault(x => x.Name == col.Name)
?? throw new InvalidOperationException($"No property {col.Name} found in type {typeof(T).Name}");
var val = prop.GetValue(value);
dataGridViewTable.Rows[newRowInd].Cells[col.Index].Value = val;
}
}
}
}
}