列表框,实现相同的接口不同对象的列表 [英] ListBox, list of different objects implementing the same interface

查看:127
本文介绍了列表框,实现相同的接口不同对象的列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个对象:用户和客户端,既实现了接口IMember

I have two objects: User and Client, both implements interface IMember

interface IMember
{
     int Id { get; set; }
     string Name { get; set; }
}

在一个表格我设定ListBox的数据源:

In a form I set ListBox data source:

myListBox.DisplayMember = "Name";
myListBox.ValueMember = "Id";
myListBox.DataSource = membersList; // List<IMember>

和奇怪的事情发生;)当我运行程序的第一个对象,whichis类型用户的,正确地显示(阿德里安塞拉芬)等物,都是至极联系人类型显示是这样的:

And wierd things happen ;) When I run program the first object, whichis type of User, displays correctly (Adrian Serafin) and other objects, wich are type of Contact are displayed like this:

MyProject.Client#20
MyProject.Client#40

作为显示是的ToString()调用它们。

as for display was ToString() call on them.

我无法通过实现相同的接口列表框中的不同数据源对象的列表,或者我做了一些在这里搞错?

I can't using list of different objects implementing the same interface as datasource in ListBox or I made some mistake here?

推荐答案

确定列表< IMember> ,而不是的ArrayList ?这使得一个很大的区别,作为一个非的存在 - 对象公共索引(公共SOMETYPE这个[INT] {获取;设置;} )使得的区别。以下工作正常:

Are you sure it is List<IMember>, and not ArrayList? This makes a big difference, as the existence of a non-object public indexer (public SomeType this[int] {get;set;}) makes a big difference. The following works fine:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
interface IMember
{
    int Id { get; set; }
    string Name { get; set; }
}
class Foo : IMember
{
    public int Id { get; set; }
    public string Name { get; set; }
}
class Bar : IMember
{ // explicit, why not...
    int IMember.Id { get; set; }
    string IMember.Name { get; set; } 
}
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        IMember bar = new Bar();
        bar.Id = 2;
        bar.Name = "def";
        var list = new List<IMember> {
            new Foo { Id = 1, Name = "abc"},
            bar,
        };
        Application.Run(new Form
        {
            Controls = {
                new ListBox {
                    Dock = DockStyle.Fill,
                    DisplayMember = "Name",
                    ValueMember = "Id",
                    DataSource = list
                }
            }
        });

    }
}

这篇关于列表框,实现相同的接口不同对象的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆