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给出了一个未处理的参数异常

Windows窗体列表框不会为每个项目显示正确的文本

首先,不要在ListBox中以两种方式填写数据。你可以用Items.Add或者DataSource。比方说,我们用后者。这样你就不用担心Items.Clear()了。因此,为了显示标题,您需要重写类FilmRecordToString()

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();)也是不必要的

评论后更新
确保DisplayMemberValueMember使用的属性是公共的

这是我的工作代码:

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();
}