Question

J'utilise un PropertyGrid dans une application outil pour afficher une fenêtre permettant de surveiller un objet dans une application distante. Toutes les secondes environ, l'application reçoit une mise à jour indiquant l'état de tous les membres qui ont changé et met à jour la grille. J'appelle Refresh () pour que les modifications prennent. Tout cela fonctionne plutôt bien sauf une chose.

Disons que l'objet est trop grand pour tenir dans la grille. Il y a donc une barre de défilement. L'utilisateur a sélectionné un élément de la grille mais a également fait défiler la liste au-dessus afin que l'élément sélectionné se trouve en dessous du bas du contrôle.

Le problème est que lors de l'actualisation (), le contrôle fait défiler automatiquement l'élément de la grille dans la vue (étrangement, il ne le fait pas lorsque l'élément est au-dessus du haut du contrôle).

Je cherche un moyen d’empêcher cela, ou de sauvegarder un état, effectuez Refresh (), puis réinitialisez-le. J'ai essayé de placer le VScrollBar sous-jacent dans le PropertyGridView dans le PropertyGrid et de jouer avec "Value", mais il ne reste pas défini de manière permanente. Revient toujours pour que l'élément soit visible.

Désélectionner l'élément pendant le défilement est ma solution de secours (le défilement automatique en vue ne se produit pas si aucun élément de la grille n'est sélectionné), mais cela gêne un peu la facilité d'utilisation, je recherche donc un autre moyen.

Quelqu'un a-t-il rencontré quelque chose de similaire?

Était-ce utile?

La solution

Cela n’est pas possible dans le MS PropertyGrid. Ce composant comporte trop d'internes inaccessibles pour vous donner la flexibilité que vous demandez et, comme vous l'avez constaté vous-même, elle n'est pas cohérente (vous avez le problème pour une propriété située en dessous de la grille mais pas quand elle est en haut). C'est pourquoi j'ai créé Smart PropertyGrid.Net . Si un produit commercial est une option pour vous, cette grille a la possibilité de stocker des états de propriété et de les restaurer après avoir effectué une action sur la grille (telle que Refresh ()) sans scintillement.

Autres conseils

J'ai trouvé un hack intéressant:

vous pouvez sélectionner manuellement les éléments de la grille que vous avez modifiés et ils seront actualisés:)

var panProp = categ.GridItems[3];
var tiltProp = categ.GridItems[4];
panProp.Select();
tiltProp.Select();

Je sélectionne donc les éléments dont j'ai besoin et je déplace la sélection de nouveau

Pour moi, ce qui suit a fait la différence:

ne pas attribuer un nouvel objet.

Mettez simplement à jour les champs de l'ancien objet avec les nouvelles données.

Désormais, lors de l'actualisation, ma PropertyGrid ne défile plus et affiche également le contenu mis à jour.

public void SoftRefreshPropertyGrid()
{
     var peMain = propertyGrid.GetType().GetField("peMain", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid)as  System.Windows.Forms.GridItem;
     if (peMain != null)
     {
           var refreshMethod = peMain.GetType().GetMethod("Refresh");
           if (refreshMethod != null)
           {
                  refreshMethod.Invoke(peMain, null);
                  propertyGrid.Invalidate(true);
           }
     }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top