Je voudrais lier un ComboBox
à un DataTable
(je ne peux pas modifier son schéma d'origine)
cbo.DataSource = tbldata;
cbo.DataTextField = "Name";
cbo.DataValueField = "GUID";
cbo.DataBind();
Je veux le ComboBox
show tbldata.Name + tbldata.Surname
.
Bien sûr, l'ajout du nouveau nom + nom de famille en tant que champ au tbldata
juste avant la liaison est possible, mais j'espère une solution plus élégante dans le sens de (pseudocode)
cbo.DataTextField = "Name";
cbo.DataTextField += "Surname";
La solution de colonne calculée est probablement la meilleure. Mais si vous ne pouvez pas modifier le schéma de la table de données pour ajouter cela, vous pouvez parcourir la table et remplir une nouvelle collection qui servira de source de données.
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();
Évidemment, ce n'est pas aussi performant que de se lier directement au DataTable, mais je ne m'inquiéterais pas à ce sujet à moins que la table ne comporte des milliers de lignes.
Le moyen le plus simple consiste à créer une nouvelle colonne calculée dans le DataTable, à l'aide de la propriété Expression:
tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname");
...
cbo.DataTextField = "FullName";
Je créerais une propriété sur votre objet de données, puis la mapperais au DataTextField
objet de données
public string FullName
{
get { return Name + " " + Surname; }
}
Code-behind
cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();
Ou implémentez l'événement 'Format' comme ceci:
DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
Avoir une propriété dans votre classe qui est le concat de nom et prénom. Et liez DataTextField à cette propriété.
Dans le cas où vous le liez à un DataTable, vous pouvez ajouter une nouvelle colonne au DataTable dont les valeurs sont concat de Nom et Prénom et le lier au combo.
Jetez un œil aux colonnes calculées à l'aide de la propriété Expression de DataColumn.
Vous pouvez enregistrer l'événement de liaison combinée et itérer les éléments, en définissant chaque texte d'élément dans les champs souhaités à l'aide de l'élément de données d'élément de zone de liste déroulante.