Je remplis un contrôle DataGridView sur un formulaire Windows (C # 2.0 et non WPF).
Mon objectif est d'afficher une grille qui remplit parfaitement toute la largeur disponible avec des cellules - c'est-à-dire aucune zone inutilisée (gris foncé) en bas à droite et dimensionne chaque colonne de manière appropriée en fonction des données qu'elle contient, mais permet également à l'utilisateur de redimensionner l'une des colonnes. à leur goût.
J'essaie d'y parvenir en définissant l'AutoSizeMode de chaque colonne sur DataGridViewAutoSizeColumnMode.AllCells, sauf pour l'une des colonnes que j'ai définies sur DataGridViewAutoSizeColumnMode.Fill afin de garantir que toute la zone de la grille est parfaitement remplie de données. (Cela ne me dérange pas que lorsque l'utilisateur tente de redimensionner cette colonne, il revient à une taille qui garantit que l'espace horizontal est toujours utilisé.)
Cependant, comme je l'ai mentionné, une fois chargé, je voudrais permettre à l'utilisateur de redimensionner les colonnes en fonction de ses propres besoins - en définissant ces valeurs AutoSizeMode pour chaque colonne, il semble que l'utilisateur ne soit pas en mesure de redimensionner ces colonnes.
J'ai essayé de ne pas définir l'AutoSizeMode de toutes les colonnes, ce qui permet le redimensionnement MAIS ne définit pas la taille initiale en fonction des données que les cellules contiennent. Le même résultat se produit lors de la modification du mode AutoSizeMode de la grille sur «Non défini» après le chargement des données.
Y a-t-il un paramètre qui me manque ici qui permet le réglage automatique des largeurs de colonne par défaut ET le redimensionnement de l'utilisateur ou y a-t-il une autre technique que je dois utiliser lors du remplissage du contrôle DataGridView?
la source
Réponses:
Cette astuce fonctionne pour moi:
Ce qui se passe ici, c'est que vous définissez la taille automatique sur le mode dont vous avez besoin, puis, colonne par colonne, vous stockez la largeur obtenue à partir du calcul de la taille automatique, supprimez la taille automatique et définissez la largeur sur la valeur que vous avez stockée auparavant.
la source
grd.Columns(i).Width = grd.Columns(i).Width
fera déjà l'affaire. Regardez ici .dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
Peut-être que tu pourrais appeler
Après avoir défini la source de données. Il définira la largeur et autorisera le redimensionnement.
Plus d'informations sur la méthode MSDN DataGridView.AutoResizeColumns (DataGridViewAutoSizeColumnsMode) .
la source
DataGridViewAutoSizeColumnsMode.DisplayedCells
. En outre, dans le Concepteur de formulaires, AutoSizeColumnsMode est défini sur Aucun. J'avais besoin d'exécuter cet appel de méthode dans le gestionnaire d'événements DataBindingComplete de DataGridView, pour m'assurer qu'il (re) dimensionnait toujours correctement.Version AC # du code de Miroslav Zadravec
Publié en tant que Wiki communautaire pour ne pas perdre la réputation des autres
la source
Dans mon application, j'ai défini
Aussi, j'ai défini le
Maintenant, les largeurs de colonne peuvent être modifiées et les colonnes peuvent être réorganisées par l'utilisateur. Cela fonctionne plutôt bien pour moi.
Peut-être que cela fonctionnera pour vous.
la source
Après avoir ajouté les données à la grille, ajoutez le code suivant qui ajustera la colonne en fonction de la longueur des données dans chaque cellule
Voici le résultat
la source
Eh bien, j'ai fait ceci comme ceci:
dans cet ordre particulier. Les colonnes sont redimensionnées (étendues) ET l'utilisateur peut redimensionner les colonnes par la suite.
la source
Si j'ai bien compris la question, il devrait y avoir un moyen plus simple d'accomplir ce dont vous avez besoin. Appel
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
Cela devrait faire l'affaire. Cependant, il existe un piège car vous ne pouvez pas simplement appeler cette méthode directement après avoir rempli votre contrôle DataGridView. Au lieu de cela, vous devrez ajouter un EventHandler pour l'événement VisibleChanged et appeler la méthode à l'intérieur.
la source
Un simple deux lignes de code fonctionne pour moi.
la source
Reprise de la question:
faire adapter la largeur de la colonne au contenu (avec une méthode différente dans la colonne),
mais permettez ensuite à l'utilisateur de définir la largeur de la colonne ...
En se développant à partir de la réponse de Miroslav Zadravec , pour moi, ce qui a fonctionné était immédiatement d'utiliser l'auto calculé
column.Width
pour définir ...column.Width
!Ceci est testé pour fonctionner lorsque le
DataGridView
est déjà créé, en utilisant une astuce comme celle-ci .la source
Cela a fait des merveilles pour moi:
la source
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Cela ajuste automatiquement toutes les colonnes en fonction de leur contenu, remplit l'espace vide restant en étirant une colonne spécifiée et empêche le comportement de «saut» en définissant la dernière colonne à remplir pour tout redimensionnement futur.
la source
Code C # légèrement plus soigné du code de Miroslav Zadravec en supposant que toutes les colonnes doivent être auto-dimensionnées
la source
Une autre version du code de Miroslav Zadravec, mais légèrement plus automatisée et universelle:
Je mets la deuxième partie dans un événement séparé, car je remplis l'
datagridvew
initialisation du formulaire et si les deux parties sont là, rien ne change, car le dimensionnement automatique calcule probablement les largeurs après l'datagridview
affichage, donc les largeurs sont toujours par défaut dans laForm1()
méthode. Après avoir terminé cette méthode, la taille automatique fait son tour et immédiatement après cela (lorsque le formulaire est affiché), nous pouvons définir les largeurs par seconde partie du code (ici enForm1Shown
cas). Cela fonctionne pour moi comme un charme.la source
Voici un code simplifié pour la réponse de Miroslav Zadravec en c #:
la source
Avez-vous essayé de configurer la
FillWeight
propriété de votreDataGridViewColumns
objet?Par exemple:
Je pense que cela devrait fonctionner dans votre cas.
la source
Une petite amélioration par rapport à la version de Schnapple
la source
dataGridView1.AutoResizeColumns ();
la source
Les largeurs de colonne définies pour s'adapter à son contenu J'ai utilisé l'instruction ci-dessous, cela a résolu mon problème.
Premier pas :
Deuxième étape :
Troisième étape :
la source
Cela devrait fonctionner que le
dataGridView
ait été affiché ou non (c'est-à-dire même s'il est appelé depuis le constructeur de classe).La même méthode, mais avec
DataGridViewAutoSizeColumnMode.DisplayedCells
, échoue dans le cas ci-dessus pour la raison évidente - aucune cellule n'a encore été affichée! Pour une raison non évidente,AutoResizeColumns
échoue également dans ce cas.la source
Si vous liez votre source de données à une table de données par exemple, vous devez définir les propriétés une fois la liaison effectuée:
la source
DataGridView.Columns
, passezAutoSizeMode
à un valide, collectez la valeur de largeur et réinitialisez-la après le changementAutoSizeMode
deDataGridViewAutoSizeColumnMode.None
).Form.Show()
ouForm.ShowDialog()
. J'ai donc mis cet extrait de code dans l'Form.Shown
événement et cela fonctionne pour moi.Mon code transformé, sans reguard de tout ce qui a été
DataGridView.AutoSizeColumnsMode
défini auparavant, j'utiliseDataGridViewColumn.GetPreferredWidth()
au lieu de changerDataGridViewColumn.AutoSizeMode
et de définir la valeur de largeur immédiatement, puis de changerDataGridView.AutoSizeColumnsMode
une fois:Assurez-vous de définir
Je ne sais pas comment cela ne fonctionne qu'après l'affichage du formulaire.
la source
Je devais le faire en VB et préférer le diviser en une méthode que j'ai placée dans un module. Vous pouvez ajouter la colonne Fill comme un autre paramètre ByRef si vous le souhaitez.
la source
Vous pouvez faire quelque chose comme ceci:
Toutes les colonnes s'adapteront au contenu sauf la dernière remplira la grille.
la source
Avec $ array étant le contenu d'un PSCustomObject, cela fonctionne:
la source