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