Есть 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}'";
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Кодирую сообщения в base64, но кодировать кириллицу затратно по памяти, а вот латиница кодируется чуть ли не в два раза меньшеЗадается вопрос,...
Как взять определённое значение из исходного кода определённого сайта?
Есть скрипт который последовательно грузит файлы на сервер в группу вкНо проблема в том, что после 20 файлов выскакивает капча и не дает грузить...