2009-04-21 5 views
0

Je suis en train d'utiliser un System.Windows.Forms.DataGrid contrôle dans mon projet basé Compact Framework 3.5 Windows Mobile Professional 6 SDK pour afficher des propriétés des objets de type Something en liant le DataGrid à une instance List<SomethingWrapper> comme ceci:Comment redimensionner des colonnes de DataGrid liées à la liste <T>, pas DataSet?

public class SomethingWrapper { 
    private Something data; 
    public SomethingWrapper(Something data) { this.data = data; } 
    public string Column1 { get { /* string from this.data */ } } 
    public string Column2 { get { /* string from this.data */ } } 
} 

public class SomethingList : List<SomethingWrapper> { 
    public SomethingList(IEnumerable<Something> items) { 
     foreach (var item in items) Add(new SomethingWrapper(item)); 
     Sort((a, b) => a.Column2.CompareTo(b.Column2); 
    } 
} 

/* ... */ 

IEnumerable<Something> dataToShow = /* assume this is filled correctly */ 
SomethingDataGrid.DataSource = new SomethingList(dataToShow); 

Cela semble fonctionner correctement: les données correctes sont affichées dans la grille avec deux colonnes appelées Column1 et Column2 et triées sur la deuxième colonne. Je veux que ce soit une vue en lecture seule de ces données, donc tout va bien.

Cependant, je voudrais régler la largeur des colonnes et ne peut pas sembler que cela fonctionne ...

ont essayé de évidente: créer TableStyle, créant par exemple de style colonne de zone de texte par colonne, en ajoutant à la TableStyle et la définition SomethingDataGrid.TableStyle au style de table résultant. (Ceci est de la mémoire, ou je montrerais aussi le code exact que j'utilise.Si nécessaire, je peux ajouter cela à la question quelque part plus tard aujourd'hui.)

Rien ne change cependant. Je soupçonne que cela a quelque chose à voir avec le MappingName sur l'objet TableStyle; tous les exemples que j'ai pu trouver hier soir semblent être pour la liaison de données un DataSet au DataGrid et le réglage MappingName au nom de table correct dans le DataSet. Sinon, le style de table ne fera pas ce que vous attendez, quel est le comportement que je vois. Question: Est-ce que je cherche au bon endroit pour une solution à mon problème, et si oui, que dois-je définir TableStyle.MappingName à lors de la liaison à un List<T> pour montrer les propriétés de T ...?

(Essayé de vérifier les éventuels doublons, mais n'a pas pu trouver les correspondances exactes S'il vous plaît me corriger si je retourne être faux là..)

Répondre

2

Ah, n'a pas l'air assez bien après tout: duplicate question found. Essayera de dériver de BindingList<T> et/ou en utilisant une source de liaison afin que je puisse commencer à appeler BindingSource.GetListName(null) pour obtenir un MappingName. J'espère que cela aidera. Sinon, je serai de retour ...

+0

L'utilisation d'un TableStyle.MappingName = BindingSource.GetListName (null) a fonctionné correctement. – peSHIr

1

Vous pouvez le faire en créant un DataGridTableStyle

Voici une méthode d'extension que j'utilise:

public static void SetColumnStyles<T>(this DataGrid ctrl, T data, params ColumnStyle[] column) where T: class 
    { 
     var ts = new DataGridTableStyle(); 
     ts.MappingName = data.GetType().Name; 

     foreach (var style in column) 
     { 
      ts.GridColumnStyles.AddColumn(style.Header, style.Column, style.Width); 
     } 

     ctrl.TableStyles.Clear(); 
     ctrl.TableStyles.Add(ts); 
    } 

Alors je l'appelle comme ceci:

var newList = queriableData.ToList(); 
    ProductEdit.DataSource = newList; 
    ProductEdit.SetColumnStyles(newList, new[] 
             { 
              new ColumnStyle("Name", 200), 
              new ColumnStyle("Manufacturer", 100), 
              new ColumnStyle("Size", 20) 
             }); 

où newList est une liste générique d'objets.

+0

Je faisais cela, mais la vraie question était plus sur les lignes de "Qu'est-ce que je mets ts.MappingName à quand je lie à autre chose qu'un DataSet?". Heureux d'entendre de vous que, apparemment, je peux simplement utiliser le nom de type de la source de données. Merci. Maintenant je peux refermer ce contrôle BindingSource. Je n'ai pas vraiment besoin de voir mes colonnes dans le designer. ;-) – peSHIr

+0

Oh, vous avez besoin du .ToList() avant de vous lier. Désolé l'homme, j'ai raté ça. J'espère que le reste du code vous sera utile. –

+0

Juste essayé le MappingName = GetType(). Nom chose, mais cela ne semble pas fonctionner.Je l'ai attendu, comme je l'ai trouvé dans la description MSDN de ListBindingHelper.GetListName() qu'il renvoie le nom de type des données lorsque listAccessors est défini sur null, ce qui équivaudrait à GetType(). Nom de toute façon. Stumped pour l'instant. Pourrait regarder plus tard. L'utilisation d'une BindingSource et BindingSource.GetListName (null) en tant que TableName semble continuer cependant à fonctionner. Donc c'est bien pour le moment. – peSHIr

Questions connexes