10

オブジェクトの複数のプロパティで構成される 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();
}

たとえば、「名前」ではなく「名前(Zip)」を使用したい。

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

4

3 に答える 3

22

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 を利用できないため、コードにエラーがある可能性があります)

于 2009-01-03T19:38:58.907 に答える
4

これを読むことをお勧めします: 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

于 2009-01-03T19:44:49.363 に答える
2

ところで、DataSource を割り当てる前に、「DataTextField」と「DataValueField」を割り当ててみてください。そうすることで、データバインディング中に「SelectedIndexChanged」イベントが発生しなくなります...

于 2009-07-13T09:21:16.423 に答える