PIbd-32_Rogashova_E.A._COP_1/COPWinForms/ComponentLBox.cs

114 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace COPWinForms
{
public partial class ComponentLBox : UserControl
{
//Макетная строка
private string layoutString;
//стартовый символ для обнаружения св-в/полей
private string startSymbol;
//конечный символ для обнаружения св-в/полей
private string endSymbol;
private event Action? _errorOccured;
public string Error { get; private set; }
public ComponentLBox()
{
InitializeComponent();
Error = string.Empty;
}
//Метод для установки информации о макетной строке и символах (стартового и конечного)
public void SetLayoutInfo(string layout, string startS, string endS)
{
if (layout == null || startS == null || endS == null)
{
return;
}
layoutString = layout;
startSymbol = startS;
endSymbol = endS;
}
//св-во для получения и заполнения индекса выбранного элемента
public int SelectedIndex
{
get
{
if (listBox.SelectedIndex == -1)
{
return -1;
}
return listBox.SelectedIndex;
}
set
{
if (listBox.SelectedItems.Count != 0)
{
listBox.SelectedIndex = value;
}
}
}
//Публичный параметризованный метод для получения объекта из выбранной строки(создать объект и через рефлексию заполнить свойства его).
public T GetObjectFromStr<T>() where T : class, new()
{
string selStr = "";
if (listBox.SelectedIndex != -1)
{
selStr = listBox.SelectedItem.ToString()!;
}
T curObject = new T();
foreach (var property in typeof(T).GetProperties())
{
if (!property.CanWrite)
{
continue;
}
int borderOne = selStr.IndexOf(startSymbol);
StringBuilder sb = new StringBuilder(selStr);
sb[borderOne] = 'a';
selStr = sb.ToString();
int borderTwo = selStr.IndexOf(endSymbol);
if (borderOne == -1 || borderTwo == -1) break;
string propertyValue = selStr.Substring(borderOne + 1, borderTwo - borderOne - 1);
selStr = selStr.Substring(borderTwo + 1);
property.SetValue(curObject, Convert.ChangeType(propertyValue, property.PropertyType));
}
return curObject;
}
//параметризованный метод, у которого в передаваемых параметрах идет список объектов какого-то класса и через этот список идет заполнение ListBox;
public void AddInListBox<T>(List<T> objects)
{
if (layoutString == null || startSymbol == null || endSymbol == null)
{
return;
}
if (!layoutString.Contains(startSymbol) || !layoutString.Contains(endSymbol))
{
return;
}
foreach (var item in objects)
{
string str = layoutString;
foreach (var prop in item.GetType().GetProperties())
{
string str1 = $"{startSymbol}" + $"{prop.Name}" + $"{endSymbol}";
str = str.Replace(str1, $"{startSymbol}" + prop.GetValue(item).ToString() + $"{endSymbol}");
}
listBox.Items.Add(str);
}
}
}
}