1 votes

Le défilement du panneau fait apparaître les commandes à mi-chemin du panneau.

J'ai un problème étrange ici. J'ai un panneau winforms auquel ont été ajoutés, de manière programmée, des étiquettes et un usercontrol (qui peut se réduire ou s'étendre). Les contrôles définis par l'utilisateur se trouvent dans des groupes et c'est là que les étiquettes entrent en jeu. En raison de la taille et du nombre de contrôles, j'ai configuré le panneau pour qu'il supporte le défilement.

Jusqu'à présent, tout va bien : Le problème survient lorsque le panneau est déroulé vers le bas à partir du haut. Toute manipulation des contrôles à l'intérieur du panneau entraîne un espace mort (vide) en haut.

La manipulation se déroule comme suit :

Lorsqu'un contrôle est ajouté, supprimé ou redimensionné, la méthode "RearrangeControls()" est appelée. La méthode maintient un nombre entier pour lequel la hauteur de tous les contrôles (et l'espace vide pour éviter que les contrôles apparaissent les uns à côté des autres) qui est ajouté à chaque fois qu'un contrôle est ajusté.

L'itération se fait à travers les groupes, puis à travers les instances de ce contrôle utilisateur pour s'assurer qu'ils sont groupés correctement. (J'espère que cette explication a du sens)

Ma méthode de réarrangement est incluse ci-dessous :

  private void RearrangeControls()
  {
     Console.WriteLine(String.Format("Top of panel: {0}", pnlMain.Top));
     this.SuspendLayout();
     //sort ranges in to ascending order, this is the primary grouping
     _lRanges.Sort(CompareStringAscending);

     //now sort items by alphabetical order, we will filter out groups later so this will not be a problem
     _lItems.Sort(CompareSelectionDetailViewAscending);

     int iYPos = 0;

     //first sort through by 
     foreach (string selectedRange in _lRanges)
     {
        int iRangeControlCount = 0;

        KryptonLabel label = pnlMain.Controls[selectedRange] as KryptonLabel;
        label.Location = new Point(_iTitleIndent, iYPos);

        iYPos += label.Height + _iControlSpacing;

        //now sort views
        foreach (SelectionDetailView selectionDetailView in _lItems)
        {
           if (selectionDetailView.Range == selectedRange)
           {
              selectionDetailView.Location = new Point(_iDetailIndent, iYPos);
              //Console.WriteLine(String.Format("{0} {1} {2}", selectionDetailView.Name, selectionDetailView.Location.X.ToString(), selectionDetailView.Location.Y.ToString()));
              iYPos += selectionDetailView.Height + _iControlSpacing;

              iRangeControlCount++;
           }
        }

        //if this is zero, then it meant the last label we aded has no controls associated wiht it.  If this is the case we shoudl remove it from the panel
        if (iRangeControlCount == 0)
        {
           iYPos -= label.Height + _iControlSpacing;
           pnlMain.Controls.Remove(label);
        }

        Console.WriteLine(String.Format("Y: {0}", iYPos));
     }

     pnlMain.ScrollControlIntoView(_oSelectedItem);
     this.ResumeLayout();
  }

Les valeurs Y de toutes les commandes de ce panneau commencent toutes à 0, elles devraient donc se trouver en haut. J'ai fait des recherches et je n'ai pas pu trouver d'informations sur la nature de cette erreur. Quelqu'un sait-il ce qui se passe ? J'apprécierais grandement toute indication, aide ou conseil à ce sujet.

2voto

Daniel Snowden Points 122

Problème résolu.

J'avais besoin d'utiliser ce qui suit :

int iYpos = pnlMain.AutoScrollPosition.Y

Si quelqu'un d'autre rencontre le même problème, j'espère que cela vous aidera.

(A ce moment-là, je m'effondre enfin devant le clavier - la journée a été longue).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X