KOP-PIbd-32-Katysheva-N-E/ComponentsLibrary/ListBoxValues.cs

147 lines
4.8 KiB
C#

using System.Reflection;
using System.Text.RegularExpressions;
using static System.Net.Mime.MediaTypeNames;
namespace ComponentsLibrary
{
public partial class ListBoxValues : UserControl
{
private string layoutString = string.Empty;
private char startSymbol = '{';
private char endSymbol = '}';
private List<object> items = new List<object>();
private EventHandler? _getObject;
public ListBoxValues()
{
InitializeComponent();
}
//событие, вызываемое при выборе строки
public event EventHandler GetObject
{
add { _getObject += value; }
remove { _getObject -= value; }
}
private void listBox_SelectedIndexChanged(object sender, EventArgs e)
{
_getObject?.Invoke(this, e);
}
//Публичное свойство для установки и получения индекса выбранной строки (set, get).
public int SelectedIndex
{
get { return listBox.SelectedIndex; }
set { listBox.SelectedIndex = value; }
}
// Публичный метод для установки макетной строки и символов
public void SetLayout(string layout, char startChar, char endChar)
{
layoutString = layout;
startSymbol = startChar;
endSymbol = endChar;
}
// Публичный метод для заполнения ListBox
public void FillListBox<T>(IEnumerable<T> itemList)
{
listBox.Items.Clear();
items.Clear();
foreach (var item in itemList)
{
if (item != null) {
items.Add(item);
string displayText = CreateDisplayText(item);
listBox.Items.Add(displayText);
}
}
}
// Метод для создания строки на основе макета
private string CreateDisplayText(object item)
{
string text = layoutString;
PropertyInfo[] properties = item.GetType().GetProperties();
foreach (var prop in properties)
{
string propertyValue = prop.GetValue(item)?.ToString() ?? string.Empty;
text = text.Replace("{" + prop.Name + "}", propertyValue);
}
return text;
}
// Публичный параметризованный метод для получения объекта из выбранной строки
public T? GetSelectedItem<T>() where T : new()
{
var item = listBox.SelectedItem;
if (item != null)
{
PropertyInfo[] properties = typeof(T).GetProperties();
string layout = layoutString;
string pattern = @"^(.*?){T}.*?(.*?){P}";
//string input2 = "Температура воздуха ТЕМПЕРАТУРА ВЫСОКАЯ, давление НИЗКОЕ";
string? selectedString = item?.ToString();
if (selectedString != null)
{
T obj = new T();
Regex regex = new Regex(pattern);
Match match = regex.Match(layout);
string[] staticText = new string[properties.Length];
if (match.Success)
{
// Извлекаем текст до {T} и до {P}
//string beforeT = match.Groups[1].Value;
//string beforeP = match.Groups[2].Value;
for (int i = 0; i < staticText.Length; i++)
{
staticText[i] = match.Groups[i+1].Value;
}
//string pattern2 = $@"{beforeT}(.*?)\{beforeP}(.*)\{beforeEnd}";
//"Температура воздуха (.*?)\\, давление (.*)\\, такие дела"
string patternStatic = $@"";
for (int i = 0; i < staticText.Length; i++)
{
if (i == staticText.Length - 1)
{
patternStatic += $"{staticText[i]}(.*)";
}
else {
patternStatic += $"{staticText[i]}(.*?)\\";
}
}
Regex regexValues = new Regex(patternStatic);
Match matchValues = regexValues.Match(selectedString);
if (matchValues.Success)
{
//object val1 = matchValues.Groups[1].Value;
//object val2 = matchValues.Groups[2].Value;
for (int i = 0; i < properties.Length; i++)
{
object value = Convert.ChangeType(matchValues.Groups[i+1].Value, properties[i].PropertyType);
properties[i].SetValue(obj, value);
}
return obj;
}
}
}
}
return default;
}
}
}