Créez un simple DataGridView avec une liste d'objets et une colonne de cases à cocher (C#)
-
11-12-2019 - |
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!
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