DataBinding与图层类

时间:2013-03-20 15:58:57

标签: c#

当我有一个中间人图层类来保存我的对象列表时,我使用的ListBox无法正确填充DisplayMembers。没有Layer类,一切都很好,但我需要它用于我的项目。这是一个非常简单的例子;

乘客

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中显示所有乘客姓名?不重写Passenger类的ToString()方法。可能是我想念的简单但我是DataBinding的新手。这是一个Windows Forms应用程序,严格限制我可以使用的内容。不允许使用XAML或WPF。

3 个答案:

答案 0 :(得分:0)

尝试使用属性

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

而不仅仅是公共领域

答案 1 :(得分:0)

看起来像两件事。如上所述,尝试使用Property而不是Field作为列表:

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

}

答案 2 :(得分: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; }
    }
}

这是你的Plane类结构。

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

ListBox DataBinding

this.aListBox.DataSource = objPlane.Passengers; 
this.aListBox.DataValueField = "ID";
this.aListBox.DataTextField = "Name";
this.aListBox.DataBind();