PIbd-32_Turner_I.A._COP_10/COP/VisualCompLib/MyListBoxObjects.cs
2023-09-28 20:53:57 +04:00

105 lines
3.4 KiB
C#
Raw Permalink 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.Text;
using System.Windows.Forms;
namespace VisualCompLib
{
public partial class MyListBoxObjects : UserControl
{
//Макетная строка
private string layoutString;
//начальный символ для обнаружения свойств/полей
private string startSymbol;
//конечный символ для обнаружения свойств/полей
private string endSymbol;
public MyListBoxObjects()
{
InitializeComponent();
}
//Метод для установки информации о макетной строке и символах (начального и конечного)
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 (listBoxObj.SelectedIndex == -1)
{
return -1;
}
return listBoxObj.SelectedIndex;
}
set
{
if (listBoxObj.SelectedItems.Count != 0)
{
listBoxObj.SelectedIndex = value;
}
}
}
//Публичный параметризованный метод для получения объекта из выбранной строки(создать объект и через рефлексию заполнить свойства его).
public T GetObjectFromStr<T>() where T : class, new()
{
string selStr = "";
if (listBoxObj.SelectedIndex != -1)
{
selStr = listBoxObj.SelectedItem.ToString();
}
T curObject = new T();
foreach (var pr in typeof(T).GetProperties())
{
if (!pr.CanWrite)
{
continue;
}
int borderOne = selStr.IndexOf(startSymbol);
StringBuilder sb = new StringBuilder(selStr);
sb[borderOne] = 'z';
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);
pr.SetValue(curObject, Convert.ChangeType(propertyValue, pr.PropertyType));
}
return curObject;
}
//параметризованный метод, у которого в передаваемых параметрах идет список объектов некого класса и через этот список идет заполнение ListBox;
public void AddInListBox<T>(List<T> objects)
{
if (layoutString == null || startSymbol == null || endSymbol == null)
{
MessageBox.Show("заполните информацию о макетной строке");
return;
}
if (!layoutString.Contains(startSymbol) || !layoutString.Contains(endSymbol))
{
MessageBox.Show("Макетная строка не содержит нужные элементы");
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}");
}
listBoxObj.Items.Add(str);
}
}
}
}