Есть ListBox,в который элементы добавляются с помощью цикла,каждый элемент ListBox - свойства экземпляра класса в строчном представлении(экземпляров класса несколько и они объединены в массив). Необходимо сделать возможность редактировать экземпляр класса, выбрав соответствующий элемент в ListBox
В компонент ListBox можно класть любые объекты, в т.ч. и разнотипные.
При этом в списке будет отображаться тот текст, который отдаёт виртуальный метод ToString() класса Object для отображаемого объекта.
(напомню, что класс Object является самым первым "прародителем" любого класса, даже когда Вы явно свой класс ни от чего не наследуете).
Соответственно, варианты решения задачи:
ToString(), чтобы он выдавал желаемый текст. Кидать в ListBox объекты этого своего класса, и ListBox будет отображать выдачу метода ToString().ToString() и даём ссылку на объект, подлежащий редактированию.ValueMember компонента ListBox. (при отсутствии свойства с заданным именем текст элемента будет браться из ToString())В любом случае, чтобы получить доступ к выбранному объекту, обращаемся к свойству SelectedItem компонента ListBox - это свойство ожидаемо имеет тип Object, поэтому не забудьте сделать приведение к нужному типу.
Демонстрационный пример кода (простая форма с одним компонентом ListBox):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// вариант 1
listBox1.Items.Add((int) 1);
listBox1.Items.Add((long) 2);
listBox1.Items.Add((char) '3');
listBox1.Items.Add((string) "4");
listBox1.Items.Add((Type) typeof(Form1));
// вариант 2
listBox1.Items.Add(new ObjectInfo(typeof(Form1), "'typeof(Form1)' (reflection)"));
listBox1.Items.Add(new ObjectInfo(this, "This Form"));
listBox1.Items.Add(new ObjectInfo(listBox1, "This ListBox object"));
/*
альтернативный (3) вариант: отображать свойство "Name";
сработает для последних 4-х элементов списка (типы разные, но свойство с именем "Name" имеют)
(для первых же 4-х элементов списка будет отображена выдача метода "ToString()", за неимением свойства "Name")
*/
// listBox1.ValueMember = "Name";
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedItem is ObjectInfo oi)
MessageBox.Show($"Выбран элемент: '{oi.Name}' класса '{oi.Object.GetType().Name}'");
}
}
// класс для объекта-обёртки
public class ObjectInfo
{
public Object Object { get; private set; }
public string Name { get; private set; }
// ... прочие свойства и методы
public ObjectInfo(Object obj, string name)
{
this.Object = obj;
this.Name = name;
// ... прочая инициализация
}
// здесь вернём то, что хотим видеть в "ListBox" по дефолту
// (при закомментированной строке с "listBox1.ValueMember")
public override string ToString()
{
return $"'{Name}' of type '{Object.GetType().Name}'";
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости