【问题标题】:ListBox, list of different objects implementing the same interfaceListBox,实现相同接口的不同对象的列表
【发布时间】:2023-04-07 17:14:02
【问题描述】:

我有两个对象:User和Client,都实现了IMember接口

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

在一个表单中我设置了ListBox数据源:

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

奇怪的事情发生了;)当我运行程序时,第一个对象(用户类型)正确显示(Adrian Serafin)和其他对象(联系人类型)显示如下:

MyProject.Client#20
MyProject.Client#40

至于显示是对它们的 ToString() 调用。

我不能在 ListBox 中使用实现与数据源相同接口的不同对象的列表,或者我在这里犯了一些错误?

【问题讨论】:

  • 什么是Contact?你的意思是Client?只是一个简单的问题:Client.Name 是否正确实施?
  • 是的,我的意思是客户。我相信是的。当我用返回 this.Name listBox 覆盖客户端类中的方法 ToString() 时正确显示
  • 我在尝试使用 DisplayMember 时遇到了类似的问题。如果执行 User.Tostring() 和 client.ToString() 会得到什么输出?

标签: c# listbox


【解决方案1】:

确定List&lt;IMember&gt;,而不是ArrayList?这会产生很大的不同,因为非object 公共索引器 (public SomeType this[int] {get;set;}) 的存在会产生很大 的不同。以下工作正常:

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

    }
}

【讨论】:

  • 你是对的:设置 myListBox.DataSource = membersList.ToList() 使控件正确显示。
【解决方案2】:

成员是 Event 类的属性:

    [ActiveRecord("cpa_events")]
public class Event : ARBase<Event>
{
         private IList<Interfaces.IMember> _members = new List<Interfaces.IMember>();
         [HasManyToAny(typeof(Interfaces.IMember),"event_id","cpa_events_members",       typeof(int), "member_type", "member_id", MetaType=typeof(string))]
         [Any.MetaValue("User", typeof(User))]
         [Any.MetaValue("Client", typeof(Client))]
         public IList<Interfaces.IMember> Members
         {
            get { return _members; }
            set { _members = value; }
         }
    }

我正在使用 AR,因此成员列表必须是 IList,下面不是 List,而是 NHibernate.Collection.Generic.PersistentGenericBag[Interfaces.IMember]。这有什么不同吗?

【讨论】:

  • 好的,对不起,下次我会这样做,我想放一些代码并在评论中这是不可能的所以我的第一个猜测是添加一个答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多