PIbd-32_Safiulova_K.N._COP/COP_7/ListBoxMany.cs

169 lines
7.2 KiB
C#
Raw Permalink Normal View History

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;
using System.Text;
2024-09-30 22:03:06 +04:00
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
2024-09-16 21:57:13 +04:00
namespace Components
{
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>();
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-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-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; }
set
{
2024-09-16 21:57:13 +04:00
if (listBox.SelectedIndex != 0)
{
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-10-01 11:30:27 +04:00
SelectedLine = listBox.SelectedItem.ToString();
}
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-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-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-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-10-01 11:30:27 +04:00
var convertedValue = Convert.ChangeType(curVal, propertyInfo.PropertyType);
propertyInfo.SetValue(curObject, convertedValue);
}
2024-09-30 22:03:06 +04:00
2024-09-16 21:57:13 +04:00
return curObject;
}
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-16 21:57:13 +04:00
while (listBox.Items.Count <= rowIndex)
{
2024-09-16 21:57:13 +04:00
listBox.Items.Add(_templateString);
}
2024-09-16 21:57:13 +04:00
string row = listBox.Items[rowIndex].ToString();
PropertyInfo propertyInfo = dataObject.GetType().GetProperty(propertyName);
2024-09-16 21:57:13 +04:00
if (propertyInfo != null)
{
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-16 21:57:13 +04:00
}