2010-03-01 12 views
1

J'ai un DataGrid avec des colonnes de modèle qui contiennent un autre DataGrid. Mon problème est que si certaines lignes ont beaucoup de contenu, leur hauteur ne s'ajuste pas, donc tout le contenu est visible, mais il est coupé, donnant l'impression que les lignes se chevauchent. Toutefois, dès que j'ajoute une nouvelle ligne à la grille ou que j'ajoute une nouvelle ligne à la mini-grille dans l'une des lignes de la grille principale, la mise en page est mise à jour et les hauteurs de ligne sont correctement redimensionnées. Le problème ne se pose donc que lorsque vous chargez la grille pour la première fois.WPF Toolkit DataGrid - chevauchement de lignes (problème de hauteur de ligne)

Existe-t-il un moyen de forcer la grille à dimensionner les hauteurs de lignes à leur contenu?

Merci

Répondre

0

Je ne suis pas sûr ce qui est, mais vous pouvez essayer appeler InvalidateVisual(), quelque temps plus tard, lorsque l'élément est chargé. Cela force la nouvelle mise en page complète passe ...

0

Le DataGrid dans mon UserControl fait la même chose. Dans cet exemple, il existe seulement 32 lignes de données avec cinq DataGridTemplateColumns consistant en un <Image> et quatre <TextBlock> s. Mon contrôle affiche les résultats de la recherche. Si je réexécute la même recherche, cela ne se fait pas toujours. En outre, le recadrage se produit seulement, à peu près, sur la première page des résultats. Les rangs plus bas sont ok.

L'utilisation de InvalidateVisual() n'aide pas.

Si quelqu'un a des idées sur la façon de résoudre ce problème ou peut indiquer s'il s'agit d'un problème connu avec ce contrôle, je serais intéressé à en entendre parler.

1

J'ai eu quelques problèmes sérieux avec ce (bug?) Aujourd'hui, donc je vais partager ce que j'ai essayé et ce presque travaillé ... (Et l'espoir que quelqu'un connaît une solution réelle)

Dans mon cas, la Le bug n'apparaissait que lorsqu'il y avait 10 lignes ou plus. Hors des rangées, dix premières rangées auraient dans certains cas une hauteur trop petite pour le contenu. (J'ai d'abord pensé que les neuf objets étaient dessinés les uns sur les autres, ce qui était stupide de ma part.) Il y a beaucoup de colonnes, donc il y a une barre de défilement. Cliquer sur la barre de défilement redimensionne les hauteurs aux valeurs appropriées.

Certaines choses que, dans mon expérience ne fonctionnent pas:

  • Modification des paramètres de virtualisation n'a eu aucun effet.
  • InvalidateVisual() et InvalidateArrange() ne fonctionnent pas. J'ai essayé à la fois datagrid et son parent.
  • La modification de la hauteur de la grille de données n'a pas fonctionné (même si je ne suis pas très satisfaite de mes tests ici)
  • Le forçage des modèles de données des cellules à une taille spécifique n'a pas eu d'effet.
  • Le fait de placer la grille de données dans un scrollviewer (de sorte que la grille de données ait tout l'espace dont elle pourrait avoir besoin ...) ne fonctionnait pas.

Cependant:

La seule chose (je trouve) que le DataGrid semble respecter est MinRowHeight-cadre, maintenant que j'y ai eu une valeur débile et j'espère que cela ne causer des problèmes plus tard lorsque les datatemplates sont modifiés.

1

J'ai rencontré le même bogue avec le DataGrid fourni avec .NET Framework 4.0. Dans certaines circonstances (pas de barre de défilement horizontale, la fenêtre est plus grande qu'une taille spécifique, ...) les lignes n'étaient pas affichées correctement mais placées sur une autre (avec un petit décalage), juste la dernière rangée était complètement visible.

J'ai d'abord essayé d'exécuter automatiquement une action d'interface utilisateur une fois les lignes remplies dans le DataGrid, afin que la mise en page soit mise à jour. Mais ensuite j'ai découvert que vous pouviez simplement rendre le contrôle en utilisant le répartiteur, ce qui, dans mon cas, a finalement corrigé le bug.

Mon tout changement de code est essentiellement ce (juste après le remplissage du DataGrid):

Action emptyAction = delegate() { }; 
myDataGrid.Dispatcher.Invoke(DispatcherPriority.Render, emptyAction); 
0

Dans mon cas, je juste besoin d'ajouter la première ligne avant que la boucle en ajoutant extras.

Je voulais 4 colonnes et n lignes comme celle-ci:

private void InitToList() { 
     Grid wp = new Grid(); 
     wp.Margin = new Thickness(0); 
     wp.ColumnDefinitions.Add(new ColumnDefinition()); 
     wp.ColumnDefinitions.Add(new ColumnDefinition()); 
     wp.ColumnDefinitions.Add(new ColumnDefinition()); 
     wp.ColumnDefinitions.Add(new ColumnDefinition()); 
     wp.RowDefinitions.Add(new RowDefinition()); // adding this fixed the overlapping 

     int curCol = 0; 
     int curRow = 0; 
     foreach (string name in toIds) { 
      if (curCol >= wp.ColumnDefinitions.Count()) { 
       wp.RowDefinitions.Add(new RowDefinition()); 
       curCol = 0; 
       curRow++; 
      } 
      CheckBox cb = new CheckBox(); 
      cb.Name = String.Format("{0}Check", name.ToLower().Replace(" ", "")); 
      cb.IsChecked = false; 
      cb.Margin = new Thickness(5, 5, 5, 5); 
      cb.Content = name; 

      Grid.SetColumn(cb, curCol); 
      Grid.SetRow(cb, curRow); 
      wp.Children.Add(cb); 
      curCol++; 
     }