Pergunta

Existe uma maneira de tornar a propriedade DataTextField de um dropdownlist em asp.net via c # composta por mais de uma propriedade de um objeto?

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

Eu quero por exemplo Não use "Nome", mas "Nome (Zip)", por exemplo.

Claro, eu posso mudar a classe MyObject, mas eu não quero fazer isso (porque a classe MyObject está em uma classe modelo e não deve fazer algo que eu preciso na UI).

Foi útil?

Solução

Adicionar outra propriedade para a classe MyObject e ligar a essa propriedade:

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

Ou se você não pode modificar MyObject, criar um objeto de invólucro na camada de apresentação (apenas para visualizar). Isso também pode ser feito usando alguns 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();

(desculpe eu não tenho Visual Studio disponível, então pode haver erros no código)

Outras dicas

Eu recomendaria ler este: http://martinfowler.com/eaaDev/PresentationModel.html

Essencialmente, você quer criar uma classe que representa a ligação a uma interface particular. Então você mapear seu modelo (Meu objeto no seu exemplo) a um objeto ViewModel, e depois ligam na lista suspensa dessa forma. É uma forma legal de se pensar sobre a separação de preocupações.

EDIT: Aqui está outra série blog sobre ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

BTW, Tente atribuir o "DataTextField" e "DataValueField" antes de atribuir o DataSource. Isso impedirá que disparar o "SelectedIndexChanged" evento enquanto databinding ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top