1

当我有一个包含对象列表的中间层类时,我使用的 ListBox 无法正确填充 DisplayMembers。没有图层类一切都很好,但我的项目需要它。这是一个非常简化的示例;

乘客

class Passenger
{
        private string name;

        public Passenger(string custName)
        {
            name = custName;
        }

        public string Name
        {
            get { return name; }
        }
}

飞机

class Plane
{
        public List<LayerClass> passengerList;

        public Plane()
        {
            // Using this instead of using Passenger, 
            // if Passenger is used there are no problems
            passengerList = new List<LayerClass>(); 
        }
}

图层类

class LayerClass
 {
        private Passenger p;
        private int ID;

        public Passenger P
        {
            get { return p; }
            set { p = value; }
        }
 }

假设我用三个乘客姓名填充飞机,然后在下面编写代码;

BindingSource bs = new BindingSource();
bs.DataSource = plane.passengerList;

aListBox.DataSource = bs;
aListBox.DisplayMember = "Name";

aListBox 将显示多行文本“ DataBinding.TestApp,LayerClass ”,而不是乘客的姓名。如果我插入此代码bs.DataMember = "P";aListBox.DisplayMember = "P.Name";,它将仅在 ListBox 中显示第一个乘客的姓名,而忽略所有其他姓名。

如何在 ListBox 中显示所有乘客姓名?没有覆盖乘客类的 ToString() 方法。可能是我缺少的一些简单的东西,但我是 DataBinding 的新手。这是一个 Windows 窗体应用程序,对我可以使用的内容有严格的限制。不允许使用 XAML 或 WPF。

4

3 回答 3

0

尝试使用属性

     public List<LayerClass> passengerList { get; set; }

而不仅仅是公共领域

于 2013-03-20T16:27:43.150 回答
0

这是您的乘客类结构。

class Passenger
{
    private Int32 id;
    private string name;

    public Passenger(Int32 _id, string custName)
    {
        id = _id;
        name = custName;            
    }

    public Int32 ID
    {
        get { return id; }
    }

    public string Name
    {
        get { return name; }
    }
}

这是您的平面类结构。

class Plane
{
    List<Passenger> lPassengers = null;
    public Plane()
    {

    }

    public List<Passenger> Passengers
    {
        get
        {
            if (this.lPassengers == null)
                this.lPassengers = new List<Passenger>();

            return this.lPassengers;
        }
        set { this.lPassengers = value; }
    }
}

当您填充通用列表时,只需执行以下操作。另外我假设你有一个数据集。如果没有,您可以更改此循环。

Plane objPlane = new Plane();
foreach(DataRow DR in objDS.Tables[0].Rows)
    obj.Plane.Passengers.Add(new Passenger(Int32.Parse(DR["id"].ToString()), DR["name"].ToString()));

列表框数据绑定

this.aListBox.DataSource = objPlane.Passengers; 
this.aListBox.DataValueField = "ID";
this.aListBox.DataTextField = "Name";
this.aListBox.DataBind();
于 2013-03-20T21:11:33.190 回答
0

看起来像两件事。如前所述,尝试在列表中使用属性而不是字段:

public List<LayerClass> PassengerList { get; private set; }

然后看起来 BindingSource 不能正常工作,所以尝试消除它:

listBox1.DisplayMember = "P.Name";
listBox1.DataSource = plane.PassengerList;

或者你可以在你的 LayerClass 中重写 ToString 函数:

class LayerClass
{
  private Passenger p;
  private int ID;

  public Passenger P
  {
    get { return p; }
    set { p = value; }
  }

  public override string ToString() {
    if (p == null) {
      return "No Passenger";
    } else {
      return p.Name;
    }
  }

}
于 2013-03-20T16:38:06.383 回答