2024-09-15 18:58:32 +04:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Linq;
|
2024-09-16 21:57:13 +04:00
|
|
|
|
using System.Reflection;
|
2024-09-15 18:58:32 +04:00
|
|
|
|
using System.Text;
|
2024-09-30 22:03:06 +04:00
|
|
|
|
using System.Text.RegularExpressions;
|
2024-09-15 18:58:32 +04:00
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
2024-09-16 21:57:13 +04:00
|
|
|
|
namespace Components
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
|
|
|
|
public partial class ListBoxMany : UserControl
|
|
|
|
|
{
|
2024-09-30 22:03:06 +04:00
|
|
|
|
private string _templateString;
|
2024-10-01 11:30:27 +04:00
|
|
|
|
private string __startSymbol;
|
|
|
|
|
private string __endSymbol;
|
2024-09-30 22:03:06 +04:00
|
|
|
|
private List<string> constantWords = new List<string>();
|
|
|
|
|
private List<string> values = new List<string>();
|
|
|
|
|
|
2024-09-15 18:58:32 +04:00
|
|
|
|
public ListBoxMany()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
}
|
2024-09-16 21:57:13 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
//Устанавливает шаблонную строку и символы начала и конца переменной.
|
|
|
|
|
public void SetTemplateString(string templateString, string _startSymbol, string _endSymbol)
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
2024-10-01 11:30:27 +04:00
|
|
|
|
if (string.IsNullOrEmpty(templateString) || string.IsNullOrEmpty(_startSymbol) || string.IsNullOrEmpty(_endSymbol))
|
2024-09-16 21:57:13 +04:00
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("Введены не все значения");
|
2024-09-15 18:58:32 +04:00
|
|
|
|
}
|
2024-09-30 22:03:06 +04:00
|
|
|
|
|
|
|
|
|
_templateString = templateString;
|
2024-10-01 11:30:27 +04:00
|
|
|
|
__startSymbol = _startSymbol;
|
|
|
|
|
__endSymbol = _endSymbol;
|
2024-09-16 21:57:13 +04:00
|
|
|
|
}
|
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
//Свойство для получения или установки индекса выбранной строки в ListBox.
|
|
|
|
|
//Если текущий индекс не равен 0, то устанавливается новый индекс.
|
2024-09-16 21:57:13 +04:00
|
|
|
|
public int SelectedIndex
|
|
|
|
|
{
|
|
|
|
|
get { return listBox.SelectedIndex; }
|
2024-09-15 18:58:32 +04:00
|
|
|
|
set
|
|
|
|
|
{
|
2024-09-16 21:57:13 +04:00
|
|
|
|
if (listBox.SelectedIndex != 0)
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
|
|
|
|
listBox.SelectedIndex = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-30 22:03:06 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
//параметризованный метод для получения объекта из выбранной строки
|
|
|
|
|
//T - класс, у которого есть пустой конструктор для возмож-ти создания экземпляра без параметров
|
|
|
|
|
public T GetObjectFromLine<T>() where T : class, new()
|
2024-09-30 22:03:06 +04:00
|
|
|
|
{
|
2024-10-01 11:30:27 +04:00
|
|
|
|
string SelectedLine = "";
|
2024-09-30 22:03:06 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
if (listBox.SelectedIndex != -1)
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
2024-10-01 11:30:27 +04:00
|
|
|
|
SelectedLine = listBox.SelectedItem.ToString();
|
2024-09-15 18:58:32 +04:00
|
|
|
|
}
|
2024-09-30 22:03:06 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
//слова из шаблонной строки
|
|
|
|
|
string[] wordsInTemplate = _templateString.Split(' ');
|
2024-09-30 22:03:06 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
//постоянные слова
|
|
|
|
|
List<string> constantWords = new List<string>();
|
|
|
|
|
|
|
|
|
|
foreach (string word in wordsInTemplate)
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
2024-10-01 11:30:27 +04:00
|
|
|
|
if (word.StartsWith(__startSymbol))
|
2024-09-16 21:57:13 +04:00
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2024-10-01 11:30:27 +04:00
|
|
|
|
constantWords.Add(word);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<int> startsOfConstant = new List<int>();
|
|
|
|
|
|
|
|
|
|
string curString = SelectedLine;
|
|
|
|
|
|
|
|
|
|
int curIndex = 0;
|
|
|
|
|
foreach (string constantWord in constantWords)
|
|
|
|
|
{
|
|
|
|
|
//Нахождение const слова целиком с текущего индекса curIndex (в подстроке, начин. с curIndex)
|
|
|
|
|
Match match = Regex.Match(curString.Substring(curIndex), $@"\b{constantWord}\b");
|
|
|
|
|
int indexOfConstant = match.Index + curIndex;
|
|
|
|
|
startsOfConstant.Add(indexOfConstant);
|
|
|
|
|
curIndex = indexOfConstant + constantWord.Length;
|
|
|
|
|
}
|
2024-09-16 21:57:13 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
//Слова, являющиеся значениями полей
|
|
|
|
|
List<string> values = new List<string>();
|
|
|
|
|
curIndex = 0;
|
|
|
|
|
int j = 0;
|
|
|
|
|
while (curIndex < SelectedLine.Length && j < constantWords.Count)
|
|
|
|
|
{
|
|
|
|
|
if (curIndex < startsOfConstant[j])
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
2024-10-01 11:30:27 +04:00
|
|
|
|
string value = SelectedLine.Substring(curIndex, startsOfConstant[j] - curIndex);
|
|
|
|
|
//если строка не пустая (не null и не одни пробелы)
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(value))
|
|
|
|
|
{
|
|
|
|
|
//добавить её и убрать лишние пробелы перед значением и после (могут быть, могут не быть)
|
|
|
|
|
values.Add(value.TrimStart().TrimEnd());
|
|
|
|
|
}
|
2024-09-15 18:58:32 +04:00
|
|
|
|
}
|
2024-10-01 11:30:27 +04:00
|
|
|
|
curIndex = startsOfConstant[j] + constantWords[j].Length;
|
|
|
|
|
j++;
|
|
|
|
|
}
|
|
|
|
|
//Если текущий индекс не последний, а все постоянные слова закончились, значит до конца строки - значение
|
|
|
|
|
if (curIndex < SelectedLine.Length)
|
|
|
|
|
{
|
|
|
|
|
values.Add(SelectedLine.Substring(curIndex).TrimStart().TrimEnd());
|
|
|
|
|
}
|
|
|
|
|
List<string> propertyNames = new List<string>();
|
|
|
|
|
foreach (string word in _templateString.Split(" "))
|
|
|
|
|
{
|
|
|
|
|
if (word.Contains(__startSymbol))
|
2024-09-16 21:57:13 +04:00
|
|
|
|
{
|
2024-10-01 11:30:27 +04:00
|
|
|
|
propertyNames.Add(Regex.Replace(word.Replace(__startSymbol, "").Replace(__endSymbol, ""), @"[^\w\s]", ""));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//Получение свойств объекта и присваивание ему полученных раньше значений
|
|
|
|
|
T curObject = new T();
|
|
|
|
|
Type curType = curObject.GetType();
|
|
|
|
|
char[] punctuations = { '.', ',', '?', '!', ';', ':', '-', '\'', '\"' };
|
|
|
|
|
for (int i = 0; i < propertyNames.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
PropertyInfo propertyInfo = curType.GetProperty(propertyNames[i]);
|
|
|
|
|
string curVal = values[i];
|
|
|
|
|
//если был вплотную знак препинания (в конце значения) - убрать (чтобы не было исключения)
|
|
|
|
|
if (punctuations.Contains(curVal[curVal.Length - 1]))
|
|
|
|
|
{
|
|
|
|
|
curVal = curVal.Remove(curVal.Length - 1);
|
2024-09-16 21:57:13 +04:00
|
|
|
|
}
|
2024-09-15 18:58:32 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
var convertedValue = Convert.ChangeType(curVal, propertyInfo.PropertyType);
|
|
|
|
|
propertyInfo.SetValue(curObject, convertedValue);
|
2024-09-15 18:58:32 +04:00
|
|
|
|
}
|
2024-09-30 22:03:06 +04:00
|
|
|
|
|
2024-09-16 21:57:13 +04:00
|
|
|
|
return curObject;
|
2024-09-15 18:58:32 +04:00
|
|
|
|
}
|
2024-09-30 22:03:06 +04:00
|
|
|
|
|
2024-10-01 11:30:27 +04:00
|
|
|
|
//Заполняет строку в ListBox на основе значения свойства объекта dataObject.
|
|
|
|
|
//Если строка с указанным индексом отсутствует, она добавляется на основе шаблонной строки.
|
2024-09-16 21:57:13 +04:00
|
|
|
|
public void FillProperty<T>(T dataObject, int rowIndex, string propertyName)
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
2024-09-16 21:57:13 +04:00
|
|
|
|
while (listBox.Items.Count <= rowIndex)
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
2024-09-16 21:57:13 +04:00
|
|
|
|
listBox.Items.Add(_templateString);
|
2024-09-15 18:58:32 +04:00
|
|
|
|
}
|
|
|
|
|
|
2024-09-16 21:57:13 +04:00
|
|
|
|
string row = listBox.Items[rowIndex].ToString();
|
|
|
|
|
PropertyInfo propertyInfo = dataObject.GetType().GetProperty(propertyName);
|
2024-09-15 18:58:32 +04:00
|
|
|
|
|
2024-09-16 21:57:13 +04:00
|
|
|
|
if (propertyInfo != null)
|
2024-09-15 18:58:32 +04:00
|
|
|
|
{
|
2024-09-16 21:57:13 +04:00
|
|
|
|
object propertyValue = propertyInfo.GetValue(dataObject);
|
2024-10-01 11:30:27 +04:00
|
|
|
|
row = row.Replace($"{__startSymbol}{propertyName}{__endSymbol}", propertyValue.ToString());
|
2024-09-16 21:57:13 +04:00
|
|
|
|
listBox.Items[rowIndex] = row;
|
2024-09-15 18:58:32 +04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-16 21:57:13 +04:00
|
|
|
|
}
|