1

オブジェクトのリストを保持する中間層クラスがある場合、使用する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; }
        }
 }

飛行機に3人の乗客の名前を入力してから、以下のコードを入力するとします。

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";、リストボックスに最初の乗客の名前のみが表示され、他のすべての名前は無視されます。

リストボックスにすべての乗客の名前を表示するにはどうすればよいですか?PassengerクラスのToString()メソッドをオーバーライドしません。私が見逃している単純なものかもしれませんが、DataBindingは初めてです。これは、使用を許可されているものに厳しい制限があるWindowsフォームアプリケーションです。XAMLまたはWPFは許可されていません。

4

3 に答える 3

0

プロパティを使用してみてください

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

パブリックフィールドだけでなく

于 2013-03-20T16:27:43.150 に答える
0

2つのように見えます。前述のように、リストにはフィールドではなくプロパティを使用してみてください。

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 に答える
0

これがPassengerクラスの構造です。

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

ListBoxデータバインディング

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