プロパティから構成されたドロップダウンリストDataTextField?
-
03-07-2019 - |
質問
オブジェクトの複数のプロパティで構成される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」を起動できなくなります。データバインディング中のイベント...