当我有一个中间人图层类来保存我的对象列表时,我使用的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。
答案 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();