using System.Reflection; using System.Text.RegularExpressions; namespace ComponentsLibrary { public partial class ListBoxValues : UserControl { private string layoutString = string.Empty; private char startSymbol = '{'; private char endSymbol = '}'; private List items = new List(); 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(IEnumerable 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().Replace(',', '.') ?? string.Empty; text = text.Replace("{" + prop.Name + "}", propertyValue); } return text; } // Публичный параметризованный метод для получения объекта из выбранной строки public T? GetSelectedItem() where T : new() { var item = listBox.SelectedItem; if (item != null) { // Получаем строковое значение string? selectedString = item?.ToString(); if (selectedString != null) { T obj = new T(); MatchCollection matches = Regex.Matches(selectedString, @"\d+(\,\d+)?"); PropertyInfo[] properties = typeof(T).GetProperties(); for (int i = 0; i < properties.Length && i < matches.Count; i++) { object value = Convert.ChangeType(matches[i].Value.Replace(",", "."), properties[i].PropertyType); properties[i].SetValue(obj, value); } return obj; } } return default; } } }