Как можно связать экземпляры класса и значения ListBox

229
30 сентября 2018, 03:00

Есть ListBox,в который элементы добавляются с помощью цикла,каждый элемент ListBox - свойства экземпляра класса в строчном представлении(экземпляров класса несколько и они объединены в массив). Необходимо сделать возможность редактировать экземпляр класса, выбрав соответствующий элемент в ListBox

Answer 1

В компонент ListBox можно класть любые объекты, в т.ч. и разнотипные. При этом в списке будет отображаться тот текст, который отдаёт виртуальный метод ToString() класса Object для отображаемого объекта.

(напомню, что класс Object является самым первым "прародителем" любого класса, даже когда Вы явно свой класс ни от чего не наследуете).

Соответственно, варианты решения задачи:

  1. В своём собственном классе, который описывает решаемую предметную область, переопределить метод ToString(), чтобы он выдавал желаемый текст. Кидать в ListBox объекты этого своего класса, и ListBox будет отображать выдачу метода ToString().
  2. Если первый вариант не годится (например, нет возможности вносить изменения в существующий класс), то можно создать новый класс - обёртку, в котором переопределяем метод ToString() и даём ссылку на объект, подлежащий редактированию.
  3. Если Вы собираетесь класть объекты одного типа (класса), и в этом классе есть публичное свойство с подходящим (для отображения в списке) текстовым значением, то указываем имя этого свойства в свойстве 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}'";
    }
}
READ ALSO
Как заменить кириллицу на латиницу и наоборот. Без ошибок при возврате на кириллицу

Как заменить кириллицу на латиницу и наоборот. Без ошибок при возврате на кириллицу

Кодирую сообщения в base64, но кодировать кириллицу затратно по памяти, а вот латиница кодируется чуть ли не в два раза меньшеЗадается вопрос,...

208
Как взять значение из исходного кода сайта?

Как взять значение из исходного кода сайта?

Как взять определённое значение из исходного кода определённого сайта?

190
Вывести элемент массива

Вывести элемент массива

Формирую массив в цикле следобразом:

194
Обработка капчи средствами php - как быть?

Обработка капчи средствами php - как быть?

Есть скрипт который последовательно грузит файлы на сервер в группу вкНо проблема в том, что после 20 файлов выскакивает капча и не дает грузить...

180