2012-03-23 19 views
11

Tengo una lista desplegable que se llena con datos en el código subyacente. El atributo DataTextField se establece con el siguiente código:¿Cómo se establece la lista desplegable DataTextField para mostrar dos campos de propiedades de datos?

ddlItems.DataTextField = "ItemName"; 

quiero mostrar dos propiedades de datos como el DataTextField. Intenté usar el siguiente código pero no funcionó. Y he investigado en la red pero no he podido encontrar cómo usar dos propiedades de datos.

ddlItems.DataTextField = "ItemName" + "ItemDescription"; 

¿Qué código debo usar para hacer esto?

+0

La respuesta de Kris Senden debe aceptarse porque es el mejor enfoque obvio – fubo

Respuesta

6

Puede usar el evento Formatting de ddlItems que le permitirá establecer la lógica de cómo convertir un determinado elemento en una cadena, o si tiene sentido usarlo en su programa, tener una propiedad como RepresentingString que devuelva Name + Desc, y se unen a esa propiedad.

pregunta similares con más respuestas y ejemplos de código: Format DropDownList.TextValue

+0

Intenté usar ddlItems.DataTextFormatString = string.Format ("{0}, {1}", "ItemName", "ItemDescription") pero no lo hace mostrar los nombres y las descripciones en la lista desplegable, simplemente muestra "ItemName, ItemDescription". – Theomax

+0

el resultado de string.Format (...) sería solo eso, por lo que sería inútil. Sugiero escuchar el evento donde un elemento se está convirtiendo en texto para mostrar, lo que le permite establecer la lógica en eso. – SimpleVar

+0

No entiendo por qué esta simple tarea no se puede lograr elegantemente en el código asp con la sintaxis <%$ %>? ¿Por qué el asp no está permitiendo esto? un poco decepcionante. ¿O tal vez hay una forma y aún no lo resolvimos? –

1

que he logrado esto antes, pero lo hice usando radcombobox telerik (que era capaz de incluir una plantilla de elementos). La plantilla era simplemente una tabla html y aparentemente 'concatenaba' los dos campos. Estoy bastante seguro de que el control asp .net estándar no tiene esta funcionalidad, pero si miras a tu alrededor encontrarás un control de terceros que sí lo hará.

Por supuesto, es posible tratar esta concatenación en la capa empresarial y definir un nuevo tipo (la estructura es probablemente la mejor) con una propiedad que contenga los dos campos como una cadena.

Estoy seguro de que hay otras maneras de lograr esto (formas más eficientes sin duda), estas son solo algunas de las formas que conozco que pueden ayudar.

16

Puede utilizar LinqToSql para hacer una nueva fuente de datos que contiene una displayField que está formateada, la forma en que quiere que sea, como:

var datasource = from x in products 
       select new { 
        x.Id, 
        x.Code, 
        x.Description, 
        DisplayField = String.Format("{0} ({1})", x.Code, x.Description) 
       }; 

comboBox.DataSource = datasource; 
comboBox.DataValueField = "Id"; 
comboBox.DataTextField = "DisplayField"; 
comboBox.DataBind(); 
0

Si está de codificación con el marco de la entidad de código primero se podría crea un nuevo campo llamado NameAndDescription y configura tu ddlItems.DataTextField = "NameAndDescription". El campo puede ser creado de la siguiente manera:

public String NameAndDescription 
    { 
     get { return this.ItemName + this.ItemDescription; } 
    } 
0

Prueba esto:

select std.Student_ID,std.Student_Name+' - '+ std.Admission_ID Student_Name 
from Student_tbl std , School_tbl sch 
where sch.School_ID = '" + School_ID + "' and std.Current_Class = '" + Class_ID + "' 
     and std.Section_ID = '" + Section_ID + "' 

DL_Student.DataTextField = "Student_Name"; 
DL_Student.DataValueField = "Student_ID"; 
0

A partir de un comentario en Format DropDownList.TextValue aprendí sobre DataColumn.Expression (DataColumn.Expression Property por lo que esta puede ser una solución válida (en mi caso que era perfecto):

DataColumn title = new DataColumn(); 
title.ColumnName = "Title"; 
title.DataType = System.Type.GetType("System.String"); 
title.Expression = "ItemName + ' - ' + ItemDescription"; 
dataTable.Columns.Add(title); 

// Or in one line 

dataTable.Columns.Add(new DataColumn("Title", System.Type.GetType("System.String"), "ItemName + ' - ' + ItemDescription")); 

ddlItems.DataSource = dataTable; 
ddlItems.DataTextField = "Title"; 
ddlItems.DataValueField = "Id"; 
ddlItems.DataBind(); 
0

El siguiente código que funcionó para mí:

select id, ItemName + ' - ' + ItemDescription as 'yournamecolumn' from `yourtable` 
ddlItems.DataTextField = "yournamecolumn"; 
ddlItems.DataValueField = "id"; 
ddlItems.DataBind(); 
1

He hecho algo similar a esto de dos maneras: ya sea en C# o SQL.

Matteo Gaggiano abajo da un buen ejemplo del método de C#:

dataTable.Columns.Add(new DataColumn("Title", System.Type.GetType("System.String"), "ItemName + ' - ' + ItemDescription")); 

ddlItems.DataSource = dataTable; 
ddlItems.DataTextField = "Title"; 
ddlItems.DataValueField = "Id"; 
ddlItems.DataBind(); 

O se puede hacer en SQL:

SELECT ItemName + ' - ' + ItemDescription AS Title FROM yourSQLtable 

y luego usar los últimos cuatro líneas más arriba en el código C# .

+0

¿Entonces la parte nueva de su respuesta a una pregunta de C# es que puede usar SQL en lugar de C#? – Teepeemm

+0

Ha pasado un tiempo (he tenido problemas para responder a los mensajes aquí, lo que probablemente sea mi culpa), pero creo que estaba diciendo que podría hacerse de cualquier manera. – Davezilla

1

forma más sencilla es en el archivo .aspx:

<asp:DropDownList ID="ddlItems" runat="server" DataSourceID="YourDataSource" DataTextField='<%# Eval("Id")+" - "+Eval("Title") %>' ..... /> 

Esperanza útil.

Cuestiones relacionadas