質問

オブジェクトの複数のプロパティで構成されるc#を介してasp.netのドロップダウンリストのdatatextfieldプロパティを作成する方法はありますか?

public class MyObject
{
  public int Id { get; set; }
  public string Name { get; set; }
  public string FunkyValue { get; set; }
  public int Zip { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
  List<MyObject> myList = getObjects();
  ddList.DataSource = myList;
  ddList.DataValueField = "Id";
  ddList.DataTextField = "Name";
  ddList.DataBind();
}

たとえば&quot; Name&quot;ではなく、&quot; Name(Zip)&quot;例:

もちろん、MyObjectクラスは変更できますが、これは行いたくありません(MyObjectクラスはモデルクラスにあり、UIで必要なことを行うべきではないため)。

役に立ちましたか?

解決

別のプロパティをMyObjectクラスに追加し、そのプロパティにバインドします:

public string DisplayValue
{
 get { return string.Format("{0} ({1})", Name, Zip); }
}

またはMyObjectを変更できない場合は、プレゼンテーションレイヤーにラッパーオブジェクトを作成します(表示のみ)。これは、いくつかのLINQを使用して行うこともできます。

List<MyObject> myList = getObjects();
ddList.DataSource = (from obj in myList
                    select new
                    {
                      Id = obj.Id,
                      Name = string.Format("{0} ({1})", obj.Name, obj.Zip)
                    }).ToList();
ddList.DataValueField = "Id";
ddList.DataTextField = "Name";
ddList.DataBind();

(申し訳ありませんが、Visual Studioを利用できないため、コードにエラーがある可能性があります)

他のヒント

これを読むことをお勧めします: http://martinfowler.com/eaaDev/PresentationModel.html

本質的に、特定のUIへのバインディングを表すクラスを作成します。したがって、モデル(この例ではMy Object)をViewModelオブジェクトにマップし、ドロップダウンリストをそのようにバインドします。関心の分離について考えるのに良い方法です。

編集:ViewModelの別のブログシリーズ: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

ところで、 &quot; DataTextField&quot;を割り当ててみてくださいおよび&quot; DataValueField&quot;データソースを割り当てる前に。そうすることで、「SelectedIndexChanged」を起動できなくなります。データバインディング中のイベント...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top