ready lab1

This commit is contained in:
revengel66 2024-09-30 20:39:14 +04:00
parent ce79918c9b
commit f098199010
4 changed files with 77 additions and 23 deletions

View File

@ -40,6 +40,7 @@
listBox.Name = "listBox"; listBox.Name = "listBox";
listBox.Size = new Size(222, 124); listBox.Size = new Size(222, 124);
listBox.TabIndex = 0; listBox.TabIndex = 0;
listBox.SelectedIndexChanged += listBox_SelectedIndexChanged;
// //
// ListBoxValues // ListBoxValues
// //

View File

@ -5,16 +5,27 @@ namespace ComponentsLibrary
{ {
public partial class ListBoxValues : UserControl public partial class ListBoxValues : UserControl
{ {
//private List<Employee> _employees;
private string layoutString = string.Empty; private string layoutString = string.Empty;
private char startSymbol = '{'; private char startSymbol = '{';
private char endSymbol = '}'; private char endSymbol = '}';
private List<object> items = new List<object>(); private List<object> items = new List<object>();
private EventHandler? _getObject;
public ListBoxValues() public ListBoxValues()
{ {
InitializeComponent(); 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). //Публичное свойство для установки и получения индекса выбранной строки (set, get).
public int SelectedIndex public int SelectedIndex
{ {
@ -36,35 +47,51 @@ namespace ComponentsLibrary
items.Clear(); items.Clear();
foreach (var item in itemList) foreach (var item in itemList)
{ {
items.Add(item); if (item != null) {
string displayText = CreateDisplayText(item); items.Add(item);
listBox.Items.Add(displayText); string displayText = CreateDisplayText(item);
listBox.Items.Add(displayText);
}
} }
} }
// Метод для создания строки на основе макета // Метод для создания строки на основе макета
private string CreateDisplayText(object item) private string CreateDisplayText(object item)
{ {
string text = layoutString; string text = layoutString;
// Регулярное выражение для поиска имен свойств PropertyInfo[] properties = item.GetType().GetProperties();
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; // Возвращаем то, что нашли, если свойства нет
});
}
// Публичный параметризованный метод для получения объекта из выбранной строки foreach (var prop in properties)
public T GetSelectedItem<T>()
{
if (listBox.SelectedIndex != -1)
{ {
return (T)items[listBox.SelectedIndex]; string propertyValue = prop.GetValue(item)?.ToString().Replace(',', '.') ?? string.Empty;
text = text.Replace("{" + prop.Name + "}", propertyValue);
}
return text;
}
// Публичный параметризованный метод для получения объекта из выбранной строки
public T? GetSelectedItem<T>() 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; return default;
} }

View File

@ -34,6 +34,7 @@
emailComponent = new ComponentsLibrary.Email(); emailComponent = new ComponentsLibrary.Email();
buttonCheckEmail = new Button(); buttonCheckEmail = new Button();
listBoxValues = new ComponentsLibrary.ListBoxValues(); listBoxValues = new ComponentsLibrary.ListBoxValues();
buttonGetListSelectedItem = new Button();
SuspendLayout(); SuspendLayout();
// //
// imageLoad // imageLoad
@ -84,13 +85,24 @@
listBoxValues.SelectedIndex = -1; listBoxValues.SelectedIndex = -1;
listBoxValues.Size = new Size(516, 224); listBoxValues.Size = new Size(516, 224);
listBoxValues.TabIndex = 4; listBoxValues.TabIndex = 4;
listBoxValues.GetObject += listBoxValues_GetObject;
listBoxValues.Load += listBoxValues_Load; listBoxValues.Load += listBoxValues_Load;
// //
// buttonGetListSelectedItem
//
buttonGetListSelectedItem.Location = new Point(12, 341);
buttonGetListSelectedItem.Name = "buttonGetListSelectedItem";
buttonGetListSelectedItem.Size = new Size(133, 23);
buttonGetListSelectedItem.TabIndex = 5;
buttonGetListSelectedItem.Text = "Получить объект";
buttonGetListSelectedItem.UseVisualStyleBackColor = true;
//
// FormComponents // FormComponents
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(549, 345); ClientSize = new Size(551, 376);
Controls.Add(buttonGetListSelectedItem);
Controls.Add(listBoxValues); Controls.Add(listBoxValues);
Controls.Add(buttonCheckEmail); Controls.Add(buttonCheckEmail);
Controls.Add(emailComponent); Controls.Add(emailComponent);
@ -109,5 +121,6 @@
private ComponentsLibrary.Email emailComponent; private ComponentsLibrary.Email emailComponent;
private Button buttonCheckEmail; private Button buttonCheckEmail;
private ComponentsLibrary.ListBoxValues listBoxValues; private ComponentsLibrary.ListBoxValues listBoxValues;
private Button buttonGetListSelectedItem;
} }
} }

View File

@ -71,5 +71,18 @@ namespace ComponentsLab
}; };
listBoxValues.FillListBox(objectList); listBoxValues.FillListBox(objectList);
} }
private void listBoxValues_GetObject(object sender, EventArgs e)
{
try
{
var selectedItem = listBoxValues.GetSelectedItem<ObjectClass>();
MessageBox.Show($"Îáúåêò ñîçäàí: {selectedItem}");
}
catch (EmailException ex)
{
MessageBox.Show(ex.Message, $"Îøèáêà ïðè çàïîëíåíèè ñâîéñòâ îáúåêòà", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
} }
} }