Проблема в следующем: я связал ListBox
со списком элементов какого-то пользовательского класса (List<Person> persons = new List<Person>()
) с помощью свойства DataSource
. Конечно, ValueMember
и DisplayMember
присваиваются соответствующим свойствам этого класса. Когда я впервые загружаю данные, все выглядит нормально. Однако, когда я нажимаю на какой-либо элемент (т.е. 7-ю позицию, считая от 1), а затем перестраиваю список И количество элементов МЕНЬШЕ 7, в результате я не вижу правильных текстов в списке. Вместо этого каждый элемент отображается как имя класса, которому предшествует пространство имен.
Другими словами, вместо списка:
- Джон Доу
- Джейн Доу
- Кто-нибудь еще
Я вижу это:
- MyNamespace.Person
- MyNamespace.Person
- MyNamespace.Person
Похоже, это зависит от последнего SelectedIndex
. Если элемента с таким индексом больше нет (элементов меньше), возникает проблема.
Пробовал разные комбинации переназначения ValueMember
и DisplayMember
, а так же присваивать null свойству DataSource
списка и переназначать список этому свойству, даже пытался присвоить -1 SelectedIndex
перед отвязкой, но ни один из них не помог.
[Изменить]
Меня попросили показать код. Я вставлю соответствующие фрагменты:
<сильный>1. Классное лицо:
public class Person
{
private int id;
private string name;
public Person(int m_id, string m_name)
{
id = m_id;
name = m_name;
}
public int Id
{
get
{
return id;
}
}
public string Name
{
get
{
return name;
}
}
}`
<сильный>2. В конструкторе формы:
List<Person> persons = new List<Person>();
<сильный>3. В методе, запущенном на кнопке 1, нажмите:
listBox1.DataSource = null; // this is optional. Commenting this line out doesn't help
persons.Add(new Person(1, "John Doe"));
persons.Add(new Person(2, "Jane Doe"));
persons.Add(new Person(3, "Somebody Else"));
listBox1.ValueMember = "Id";
listBox1.DisplayMember = "Name";
listBox1.DataSource = persons;
<сильный>4. В методе, запущенном на кнопке2, нажмите:
listBox1.DataSource = null; // this is optional. Commenting this line out doesn't help
persons.Add(new Person(1, "Person One"));
persons.Add(new Person(2, "Person Two"));
listBox1.ValueMember = "Id";
listBox1.DisplayMember = "Name";
listBox1.DataSource = persons;
Когда я нажимаю кнопку 1, список заполняется, и все работает нормально. Когда я выбираю последний элемент («Кто-то еще»), а затем нажимаю кнопку 2, в списке отображаются 2 идентичных элемента: «MyNamespace.Person».
[Редактировать 2 — полный код формы]
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace MyNamespace
{
public partial class Form1 : Form
{
private List<Person> persons = new List<Person>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
persons.Clear();
persons.Add(new Person(1, "John Doe"));
persons.Add(new Person(2, "Jane Doe"));
persons.Add(new Person(1, "Somebody Else"));
listBox1.DataSource = null;
listBox1.ValueMember = "Id";
listBox1.DisplayMember = "Name";
listBox1.DataSource = persons;
}
private void button2_Click(object sender, EventArgs e)
{
persons.Clear();
persons.Add(new Person(1, "Person One"));
persons.Add(new Person(2, "Person Two"));
listBox1.DataSource = null;
listBox1.ValueMember = "Id";
listBox1.DisplayMember = "Name";
listBox1.DataSource = persons;
}
}
class Person
{
private int id;
private string name;
public Person(int m_id, string m_name)
{
id = m_id;
name = m_name;
}
public int Id
{
get
{
return id;
}
}
public string Name
{
get
{
return name;
}
}
public string ToString()
{
return id + ". " + name;
}
}
}
Действия по воспроизведению проблемы:
- Запустить форму
- Нажмите кнопку1
- Выберите последнюю позицию в списке ("Кто-то еще")
- Нажмите кнопку2
Если вы выберете «John Doe» или «Jane Doe» в списке, все будет работать нормально. Кажется, что это «сбой», когда выбранный индекс недействителен после перестроения списка. Я думаю, это какой-то баг.