c# - usar - ¿Cómo puedo vincular un ComboBox para que el displaymember sea concat de 2 campos de datatable de origen?
llenar un combobox con una consulta sql (7)
Me gustaría vincular un ComboBox
a una DataTable
(no puedo alterar su esquema original)
cbo.DataSource = tbldata;
cbo.DataTextField = "Name";
cbo.DataValueField = "GUID";
cbo.DataBind();
Quiero que el ComboBox
muestre tbldata.Name + tbldata.Surname
.
Por supuesto, agregar el nuevo nombre + apellido como un campo al tbldata
justo antes de la vinculación es posible, pero estoy esperando una solución más elegante a lo largo de las líneas de (pseudocódigo)
cbo.DataTextField = "Name";
cbo.DataTextField += "Surname";
Crearía una propiedad en su objeto de datos y luego lo correlacionaría con el DataTextField
Objeto de datos
public string FullName
{
get { return Name + " " + Surname; }
}
Código detrás
cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();
Eche un vistazo a las columnas calculadas usando la propiedad Expression de DataColumn.
La forma más fácil es crear una nueva columna calculada en DataTable, utilizando la propiedad Expression:
tbldata.Columns.Add("FullName", typeof(string), "Name + '' '' + Surname");
...
cbo.DataTextField = "FullName";
La solución de columna calculada es probablemente la mejor. Pero si no puede modificar el esquema de la tabla de datos para agregar eso, puede recorrer la tabla y completar una nueva colección que servirá como fuente de datos.
var dict = new Dictionary<Guid, string>();
foreach (DataRow row in dt.Rows)
{
dict.Add(row["GUID"], row["Name"] + " " + row["Surname"]);
}
cbo.DataSource = dict;
cbo.DataTextField = "Value";
cbo.DataValueField = "Key";
cbo.DataBind();
Obviamente, esto no es tan eficaz como el enlace directo al DataTable, pero no me preocuparía a menos que la tabla tenga miles de filas.
O implemente el evento ''Formato'' de esta manera:
DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
Puede registrar el evento de enlace combinado e iterar los elementos, configurando el texto de cada elemento en los campos deseados utilizando el elemento de datos del elemento del cuadro combinado.
Tenga una propiedad en su clase que sea el concat de Nombre y Apellido. Y unir DataTextField a esta propiedad.
En caso de que lo esté enlazando a un DataTable, puede agregar una nueva columna al DataTable cuyos valores son concat de Nombre y Apellido y vincularlo al combo.