Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体列表框赢得';t为每个项目显示正确的文本_C#_Winforms_Listbox - Fatal编程技术网

C# Windows窗体列表框赢得';t为每个项目显示正确的文本

C# Windows窗体列表框赢得';t为每个项目显示正确的文本,c#,winforms,listbox,C#,Winforms,Listbox,我实际上已经完成了这个项目。它经过测试,工作正常,显示了正确的值 今天,它不会在列表框中显示正确的文本 这是我的密码: private void filmBtnLoadFilms_Click(object sender, EventArgs e) { FilmServiceClient filmClient = new FilmServiceClient("NetTcpBinding_IFilmService"); ShowServiceClient showClient = n

我实际上已经完成了这个项目。它经过测试,工作正常,显示了正确的值

今天,它不会在列表框中显示正确的文本

这是我的密码:

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();
}
希望你能帮我找到答案。首先谢谢

新的更新。
如果我将调用移动到datasource、datamember和value member,则filmList.ValueMember会给出一个未经处理的参数异常。

您需要手动添加项吗

foreach (var film in list)
{
    filmList.Items.Add(film);
}
然后使用
数据源

this.filmList.DataSource = list;
这是用项目填充列表框的两种不同方法

顺便说一下,设置
DataSource
将删除添加的现有项
另一方面,在设置了
DataSource
之后手动添加项将引发
System.ArgumentException

对于显示的文本
ListBox
调用在
DisplayMember

如果名称为空或属性不可访问
ListBox
reset
displaymber=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();
}  

首先,不要将数据双向填充到列表框中。您可以使用
项。添加
数据源
。比方说,我们使用后者。这样,您就不必担心
项。Clear()
也可以。因此,为了显示标题,您需要覆盖类的
FilmRecord
ToString()

public override string ToString() { return this.Title; }

这样做是因为默认情况下,您的列表框也在调用引擎盖下的
ToString
。对类对象调用此方法只会显示类的名称及其命名空间,除非重写它以提供自定义实现

现在显示的是什么?路径->libraryname.wcfservicereference.record.object类似于此,因为您将列表绑定到filmList中,所以不需要清除filmList并逐个添加列表的内容。无论如何,由于应用程序依赖于(我猜)一个web服务,您是否检查了响应?你用过网纸吗?如果是这样,目标格式可能会更改,从而导致错误的结果。我确实从我的WCF中获取了正确的数据。但它只是无法为列表框中的对象设置正确的名称。Awesome
catch
。看起来你开发了有史以来最稳定的应用程序。我现在已经改变了方法,只使用数据源。我仍然得到WCF记录的路径,而不是objects变量的标题。它优化了代码,但DisplayMember没有显示标题,而是显示“desktopclient.cinemaservicereference…”等等。@McBoman,请检查类型为
FilmRecord
的属性
Title
ID
是否具有
public
access修饰符。对于显示的文本,默认情况下使用
DisplayMember
属性。仅当值为空或访问该属性失败时,才会调用
ToString()
。在OP的案例中,你的答案是解决方法,而不是解决方案solution@Fabio你不能说这只是解决问题的一个办法。问题是填充列表框以显示值而不是对象的类型。现在,这可以通过多种方式实现。其中两个已经在OP中试过了。我刚刚提供了一个可行的第三个选项。没有理由认为它是错误的,或者是上面提到的第二个。我同意-你的解决方案可以显示所需的文本。但是基于代码this.filmList.ValueMember=“Id”,我想他以后想使用
SelectedValue
属性。在您的方法中,
SelectedValue
将始终为空。这就是为什么我评论你的答案作为解决办法。我认为
ToString()
不是显示文本的好方法,除非您只在列表控件中键入用于显示项目的内容