73 lines
2.2 KiB
C#
73 lines
2.2 KiB
C#
|
using System.Reflection;
|
|||
|
using System.Text.RegularExpressions;
|
|||
|
|
|||
|
namespace ComponentsLibrary
|
|||
|
{
|
|||
|
public partial class ListBoxValues : UserControl
|
|||
|
{
|
|||
|
//private List<Employee> _employees;
|
|||
|
private string layoutString = string.Empty;
|
|||
|
private char startSymbol = '{';
|
|||
|
private char endSymbol = '}';
|
|||
|
private List<object> items = new List<object>();
|
|||
|
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<T>(IEnumerable<T> 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<T>()
|
|||
|
{
|
|||
|
if (listBox.SelectedIndex != -1)
|
|||
|
{
|
|||
|
return (T)items[listBox.SelectedIndex];
|
|||
|
}
|
|||
|
return default;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|