在任何情况下,要访问选定的对象,我们访问SelectedItem组件的属性ListBox- 这个属性应该是 type 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}'";
}
}
ListBox您可以将任何对象放入组件中,包括。并且多种多样。在这种情况下,列表将显示为显示的对象提供虚拟ToString()类方法的文本。Object(让我提醒你,一个类
Object是任何类的第一个“祖先”,即使你明确地没有从任何东西继承你的类)。因此,解决问题的选项:
ToString()以生成所需的文本。扔在ListBox你的这个类的对象上,ListBox将显示ToString().ToString()并提供指向对象的链接编辑。ValueMember在组件的属性中指定此属性的名称ListBox。(如果没有给定名称的属性,则元素的文本将从 中获取ToString())在任何情况下,要访问选定的对象,我们访问
SelectedItem组件的属性ListBox- 这个属性应该是 typeObject,所以不要忘记转换为所需的类型。演示代码示例(带有一个 ListBox 组件的简单表单):