Windows窗体列表框不会为每个项目显示正确的文本
本文关键字:显示 项目 文本 列表 窗体 Windows | 更新日期: 2023-09-27 17:51:17
我实际上已经完成了这个项目。它经过测试,工作完美,显示正确的值。
今天它不会在列表框中显示正确的文本。
下面是我的代码:private void filmBtnLoadFilms_Click(object sender, EventArgs e)
{
FilmServiceClient filmClient = new FilmServiceClient("NetTcpBinding_IFilmService");
ShowServiceClient showClient = new ShowServiceClient("NetTcpBinding_IShowService");
FilmRecord[] list = null;
try
{
//Retrieve all films
if (list == null)
{
list = filmClient.RetrieveAllFilms();
}
if (filmList.Items.Count > 0)
{
filmList.Items.Clear();
}
foreach (var film in list)
{
filmList.Items.Add(film);
}
this.filmList.DataSource = list;
this.filmList.DisplayMember = "Title";
this.filmList.ValueMember = "Id";
}
catch
{
logLabel.Text = "Film kunne ikke indlæses";
}
showClient.Close();
filmClient.Close();
}
希望你能帮助找到答案。提前谢谢。
新更新。如果我移动调用来数据源,数据成员和值成员,然后电影列表。ValueMember给出了一个未处理的参数异常
首先,不要在ListBox中以两种方式填写数据。你可以用Items.Add
或者DataSource
。比方说,我们用后者。这样你就不用担心Items.Clear()
了。因此,为了显示标题,您需要重写类FilmRecord
的ToString()
。
public override string ToString() { return this.Title; }
这样做是因为默认情况下,你的ListBox也在底层调用ToString
。在类对象上调用此方法只会显示类的名称及其名称空间,除非它被重写以提供自定义实现。
您手动添加条目
foreach (var film in list)
{
filmList.Items.Add(film);
}
则使用DataSource
。
this.filmList.DataSource = list;
这是用
项填充列表框的两种不同方法顺便说一下,设置DataSource
将删除已添加的项
另一方面,在DataSource
设置后手动添加项目将抛出System.ArgumentException
对于显示的文本ListBox
,调用DisplayMember
中给定名称的项的属性
如果名称为空或属性不可访问,则ListBox
复位DisplayMember = String.Empty
和.ToString()
将被调用。
这就是为什么你在列表中得到类型的名称。
如果你想使用DataSource
填充列表框的项目,然后删除代码块的项目手动添加,那么清除项目(filmList.Items.Clear();
)也是不必要的
评论后更新
确保DisplayMember
和ValueMember
使用的属性是公共的
这是我的工作代码:
private void filmBtnLoadFilms_Click(object sender, EventArgs e)
{
FilmServiceClient filmClient = new FilmServiceClient("NetTcpBinding_IFilmService");
ShowServiceClient showClient = new ShowServiceClient("NetTcpBinding_IShowService");
try
{
this.filmList.DisplayMember = "Title";
this.filmList.ValueMember = "Id";
this.filmList.DataSource = filmClient.RetrieveAllFilms();
}
catch
{
logLabel.Text = "Film kunne ikke indlæses";
}
showClient.Close();
filmClient.Close();
}