问题如下:我使用属性将关联到ListBox
一些自定义类(List<Person> persons = new List<Person>()
)的元素列表DataSource
。当然ValueMember
和DisplayMember
都分配给该类的适当属性。当我第一次加载数据时,一切看起来都很好。但是,当我单击某个项目(即从1开始从第7位开始)然后重新构建列表时,元素数量少于7个,结果我在列表上看不到正确的文本。而是,每个项目都显示为一个类名,后跟名称空间。
换句话说,而不是列表:
我看到了:
看来取决于最后一个SelectedIndex
。如果不再有具有该索引的项目(项目更少),则会出现问题。
我尝试了重新分配ValueMember
和的不同组合DisplayMember
,以及将nullDataSource
分配给列表的属性并将列表重新分配给此属性,甚至尝试SelectedIndex
在解除绑定之前将-1分配给,但是它们都没有帮助。
[编辑]
我被要求显示一些代码。我将粘贴相关片段:
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.在buton1上触发的方法中,单击:
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.在buton2上触发的方法中,单击:
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;
当我单击button1时,列表框已填充,并且一切正常。当我选择最后一个项目(“ Somebode Else”)然后按一下button2时,列表框将显示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;
}
}
}
重现此问题的步骤:
如果您在列表中选择“ John Doe”或“ Jane Doe”,则一切正常。重建列表后所选索引无效时,似乎“崩溃”。我想这是一些错误。
当一个设置DataSource
到null
它清除DisplayMember
值。因此,要解决此问题,请在设置新的设置后DataSource
问题消失。
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.DataSource = persons;
listBox1.DisplayMember = "Name";
否则,在Person类中重写该ToString
方法以确保如果DataMember
为空,则将显示正确的属性:
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;
}
}
public override string ToString()
{
return name;
}
}
这样,无论何时将列表框数据源设置为列表List<Person>
框,都将自动使用ToString方法作为显示。使用selectedItem属性仅仅是铸造它作为人的事,(Person)listBox1.SelectedItem
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句