web-dev-qa-db-fra.com

Comment lier un ComboBox pour que le displaymember soit concat de 2 champs de source datatable?

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";
25
callisto

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.

26
Jamie Ide

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";
19
Thomas Levesque

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();
5
bendewey

Ou implémentez l'événement 'Format' comme ceci:

DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
4
anaconda

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.

2
Rashmi Pandit

Jetez un œil aux colonnes calculées à l'aide de la propriété Expression de DataColumn.

1
Ajw

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.

0
Tamir