Question

J'ai regardé beaucoup d'endroits et j'ai du mal à faire cette chose soi-disant simple.J'ai un formulaire Windows sur lequel je dois afficher un simple DataGridView sous cette forme :

| (CheckBoxColumn) | Filepath | Filestate |

Maintenant, il y a quelques problèmes.Les données que je dois leur lier se trouvent dans une liste d'objets comme celle-ci :

    class FileObject
    {
        string filePath;
        string fileState;
    }

    //Now here's the list of these objects which I populate somehow. 
    List<FileObject> listFiles;
  • Existe-t-il un moyen efficace de lier cela directement à DataGridView afin que les différents membres de l'objet dans la liste soient liés à différentes colonnes, et pour chacun il y a une case à cocher?
  • J'ai vu les exemples d'ajouter la colonne de case à cocher à un dataGrid, mais aucun d'entre eux n'a montré comment l'ajouter également à la ligne 'en-tête', afin qu'il puisse se comporter comme une boîte `` vérifiez tous '/' décochez tous '.

Toute aide pour y parvenir serait formidable !J'écris des applications simples en C# mais je n'ai jamais eu à travailler avec des grilles de données, etc.:(

Merci!

Était-ce utile?

La solution

Le contrôle DataGridView dispose d'une fonctionnalité permettant de générer automatiquement des colonnes qui peuvent être définies par la propriété AutoGenerateColumns.Cette propriété est définie par défaut sur true : les colonnes sont générées automatiquement par défaut.

Cependant, les colonnes ne sont automatiquement générées que pour les propriétés publiques de l'objet que vous liez à la grille : les champs n'apparaissent pas.

La génération automatique fonctionne également pour les colonnes de cases à cocher lorsqu'il existe une propriété booléenne publique sur l'objet lié.

Ainsi, le moyen le plus simple de répondre à vos deux premières exigences est de modifier votre FileObject classe à ceci :

public class FileObject
{
    public string FilePath { get; set; }
    public string FileState { get; set; }
    public bool Selected { get; set; }
}

Si vous ne pouvez pas modifier cette classe, le mieux serait de créer un objet wrapper contenant un objet fichier :

public class FileObjectWrapper
{
    private FileObject fileObject_;

    FileObjectWrapper()
    {
        fileObject_ = new FileObject();
    }

    FileObjectWrapper(FileObject fo)
    {
        fileObject_ = fo;
    }

    public string FilePath
    {
        get { return fileObject_.filePath; }
        set { fileObject_.filePath = value; }
    }

    public string FileState
    {
        get { return fileObject_.fileState; }
        set { fileObject_.fileState= value; }
    }

    public bool Selected { get; set; }
}

Vous pouvez ensuite créer votre liste à laquelle vous lier (une BindingList est généralement préférable) en faisant quelque chose comme :

var fowList = new BindingList<FileObjectWrapper>();

foreach (FileObject fo in // here you have your list of file objects! )
{
    fowList.Add(new FileObjectWrapper(fo));
}

dataGridView1.DataSource = fowList;    

Il existe de nombreuses façons de procéder comme ci-dessus, mais il s’agit d’une idée générale.


Vous pouvez également ajouter un non lié DataGridViewCheckBoxColumn à la grille, même si je trouve plus facile de l'avoir dans la liste liée.Voici comment procéder si vous en avez besoin :

DataGridViewCheckBoxColumn c = new DataGridViewCheckBoxColumn();
c.Name = "Selected";
dataGridView1.Columns.Add(c);

Enfin, pour avoir une option "SelectedAll" dans l'en-tête, vous devrez utiliser du code personnalisé.

L'article sur CodeProject auquel Umesh a lié (Colonne d'en-tête CheckBox pour DataGridView) semble assez facile à mettre en œuvre - ils créent un DataGridViewHeaderCell outrepassant le Paint et OnMouseClick méthodes.

Autres conseils

Veuillez vous référer à l'exemple ci-dessous, indiquant exactement ce que vous recherchez

http://www.codeproject.com/articles/20165 / case à cocher-Header-Colonne-for-DataGridView

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top