78 votes

Comment lier une liste de chaînes à une grille de données?

cela semble assez facile et il doit y avoir un moyen de le faire: j'ai un simple List<string> et j'aimerais qu'il soit affiché dans une colonne de dataGrid. si c'étaient des objets plus complexes, je saurais comment définir les textes affichés dans les colonnes, mais je veux afficher uniquement des chaînes et si je définissais la liste comme source de données d'un datagrid

 myDataGrid.DataSource = myStringList;
 

Je reçois une colonne appelée Longueur et les longueurs des chaînes sont affichées. Comment puis-je le faire?

92voto

Tamanna Jain Points 451

Essaye ça:

 IList<String> list_string= new List<String>();
DataGridView.DataSource = list_string.Select(x => new { Value = x }).ToList();
dgvSelectedNode.Show();
 

J'espère que ça aide.

67voto

sinm Points 892

C'est parce que DataGridView recherche les propriétés des objets contenant. Pour string, il n'y a qu'une propriété - longueur. Donc, vous avez besoin d'un wrapper pour une chaîne comme celle-ci

 public class StringValue
{
    public StringValue(string s)
    {
        _value = s;
    }
    public string Value { get { return _value; } set { _value = value; } }
    string _value;
}
 

Liez ensuite l'objet List<StringValue> à votre grille. Ça marche

19voto

jamisonLikeCode Points 571

Ce qui suit devrait fonctionner tant que vous êtes lié à tout ce qui implémente IEnumerable <string>. Il liera la colonne directement à la chaîne elle-même plutôt qu'à un chemin de propriété de cet objet chaîne.

 <sdk:DataGridTextColumn Binding="{Binding}" />
 

13voto

Jarek Kardas Points 6956

vous pouvez également utiliser linq et les types anonymes pour obtenir le même résultat avec beaucoup moins de code comme décrit ici.

Mise à JOUR: le blog est en panne, voici le contenu:

(..) Les valeurs indiquées dans le tableau représentent la longueur des cordes à la place de la chaîne de valeurs (!) Il peut sembler étrange, mais c'est la façon dont le mécanisme de liaison fonctionne par défaut donné par un objet, il va essayer de se lier à la première propriété d'un objet (la première propriété, il peut se trouver). Lorsqu'il est passé d'une instance de la classe String la propriété il se lie à l'est de la Chaîne.Durée, car il n'y a pas d'autres biens que fournirait la chaîne elle-même.

Cela signifie que pour obtenir notre droit contraignant nous avons besoin d'un objet wrapper qui permettra de présenter la valeur réelle d'une chaîne de caractères comme une propriété:

public class StringWrapper
    {
     string stringValue;
     public string StringValue { get { return stringValue; } set { stringValue = value; } }

     public StringWrapper(string s)
     {
     StringValue = s;
     }
  }   

   List<StringWrapper> testData = new List<StringWrapper>();

   // add data to the list / convert list of strings to list of string wrappers

  Table1.SetDataBinding(testdata);

Bien que cette solution fonctionne comme prévu, il nécessite un certain nombre de lignes de code (surtout pour convertir la liste des chaînes à la liste de chaîne de pâtes).

Nous pouvons améliorer cette solution par l'utilisation de LINQ et les types anonymes -, nous allons utiliser une requête LINQ pour créer une nouvelle liste de chaîne de wrappers (enveloppe de chaîne sera un type anonyme dans notre cas).

 var values = from data in testData select new { Value = data };

 Table1.SetDataBinding(values.ToList());

Le dernier changement que nous allons faire est de déplacer le code LINQ à une méthode d'extension:

public static class StringExtensions
  {
     public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)
     {
     var values = from data in strings
     select new { Value = data };

     return values.ToList();
     }

De cette façon, on peut réutiliser le code par appel de méthode unique sur toute la collection de chaînes de caractères:

Table1.SetDataBinding(testData.CreateStringWrapperForBinding());

8voto

user1246920 Points 41

Ceci est un problème courant, une autre façon consiste à utiliser un objet DataTable

 DataTable dt = new DataTable();
dt.Columns.Add("column name");

dt.Rows.Add(new object[] { "Item 1" });
dt.Rows.Add(new object[] { "Item 2" });
dt.Rows.Add(new object[] { "Item 3" });
 

Ce problème est décrit en détail ici: http://www.psworld.pl/Programming/BindingListOfString

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X