using System.Reflection; using System.Text.RegularExpressions; namespace ComponentsLibrary { public partial class ListBoxValues : UserControl { //private List _employees; private string layoutString = string.Empty; private char startSymbol = '{'; private char endSymbol = '}'; private List items = new List(); public ListBoxValues() { InitializeComponent(); } //Публичное свойство для установки и получения индекса выбранной строки (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) { items.Add(item); string displayText = CreateDisplayText(item); listBox.Items.Add(displayText); } } // Метод для создания строки на основе макета private string CreateDisplayText(object item) { string text = layoutString; // Регулярное выражение для поиска имен свойств var regex = new Regex($@"{startSymbol}(\w+){endSymbol}"); return regex.Replace(text, match => { string propertyName = match.Groups[1].Value; PropertyInfo prop = item.GetType().GetProperty(propertyName); if (prop != null) { return prop.GetValue(item)?.ToString() ?? string.Empty; } return match.Value; // Возвращаем то, что нашли, если свойства нет }); } // Публичный параметризованный метод для получения объекта из выбранной строки public T GetSelectedItem() { if (listBox.SelectedIndex != -1) { return (T)items[listBox.SelectedIndex]; } return default; } } }