Question

Je ne parviens pas à utiliser flowlayoutPanel dans une application winform C #. Ce que j’ai en fait, c’est un panneau d’agencement de flux comportant 3 sections.

La section n ° 1 est un ensemble de 2 contrôles .. deux contrôles déroulants, ils sont toujours dans le même ordre, toujours visibles dans toutes les instances

La section n ° 2 est un ensemble de 5 contrôles différents ... en fonction d'une série de facteurs, l'un des 5 contrôles est visible, tous les autres ont la propriété Visible définie sur false

La section 3 est un ensemble de 3 contrôles. Comme la section 1, ils sont toujours dans le même ordre et toujours visibles.

En résumé, la section 2 est variable, les autres sont statiques.

Le problème vient de la section n ° 2 ... lorsque je modifie la visibilité de l'un des contrôles, ils apparaissent parfaitement (IE ... section 1 puis section 2 puis section 3) ... SAUF lorsque je règle la liste déroulante contrôle pour être visible .... dans ce cas, et SEULEMENT dans ce cas ... l'ordre devient (Section 1 puis Section 3 puis Section 2) ... Je ne peux pas comprendre ce qui ferait en sorte que l'ordre soit hors de synchroniser dans ce cas.

Ce que je fais fondamentalement au début de ma méthode est de définir TOUS les contrôles sur Visible = false ... puis de définir Section 1 Visible = true ..., puis de parcourir les conditions de la section 2 et de définir les contrôles appropriés Visible = true et définissez enfin les contrôles de la section 3 Visible = true.

Quelqu'un at-il une expérience de la commande de contrôle du panneau de présentation de flux? Je ne peux pas comprendre ce qui se passe pour la ComboBox.

Était-ce utile?

La solution

Peut-être serait-il plus facile de déposer un autre panneau de flux de données dans la section 2, puis de déposer vos contrôles de section 2 dans celui-ci? De cette façon, les commandes visibles dans votre panneau supérieur ne changent jamais et vous n’aurez plus à vous soucier de la commande.

Autres conseils

À l'intérieur de FlowLayoutPanel.Controls , une fonction de méthode appelée SetChildIndex (Control c, int index) permet de définir un objet pour un index spécifique.

Etant donné que FlowLayoutPanel utilise les index du contrôle pour déterminer l'ordre dans lequel les dessiner, vous pouvez le définir sur l'index du contrôle avec lequel vous souhaitez échanger, et il supprimera celui qui contrôle l'index jusqu'à un, et chaque index après.

Voici un extrait de mon blog de réorganiser les PictureBox dans un FlowLayoutPanel.

Ajouter un FlowLayoutPanel sur un formulaire WinForm nommé flowLayoutPanel1 :

public partial class TestForm: Form
{
   public TestForm()
    {
        InitializeComponent();
        this.flowLayoutPanel1.AllowDrop = true
    }

    private void AddImageToBlog(System.Drawing.Image image)
    {
        PictureBox pbox = new PictureBox();
        pbox.SizeMode = PictureBoxSizeMode.Zoom;            
        pbox.Height = (_picturebox_height * _ScaleFactor);
        pbox.Width = (_picturebox_width * _ScaleFactor);
        pbox.Visible = true;
        pbox.Image = image;

        pbox.MouseDown += new MouseEventHandler(pbox_MouseDown);
        pbox.DragOver += new DragEventHandler(pbox_DragOver);            
        pbox.AllowDrop = true;
        flpNewBlog.Controls.Add(pbox);
    }

    void pbox_DragOver(object sender, DragEventArgs e)
    {
        base.OnDragOver(e);
        // is another dragable
        if (e.Data.GetData(typeof(PictureBox)) != null)
        {
            FlowLayoutPanel p = (FlowLayoutPanel)(sender as PictureBox).Parent;                 
            //Current Position             
            int myIndex = p.Controls.GetChildIndex((sender as PictureBox));

            //Dragged to control to location of next picturebox
            PictureBox q = (PictureBox) e.Data.GetData(typeof(PictureBox));                
            p.Controls.SetChildIndex(q, myIndex);
        }           
    }

    void pbox_MouseDown(object sender, MouseEventArgs e)
    {
        base.OnMouseDown(e);
        DoDragDrop(sender, DragDropEffects.All);
    }
}

Vous pouvez réorganiser les contrôles dans le tableau de bord, en modifiant la propriété parent des contrôles et en réaffectant la propriété parent avec l'ordre souhaité.

Essayez cette solution générique dans laquelle vous pouvez trier vos contrôles en fonction d’une propriété du contrôle utilisateur.

// When adding and removing controls, the order is not kept.
var runsOrderedByStartDate = this.nodesFlowLayoutPanel.Controls.Cast<RunNodeControl>().Select(_ => new { StartDate = _.StartDateTime, RunControl = _ }).OrderBy(_ => _.StartDate).ToList();

// Sets index of controls according to their index in the ordered collection
foreach (var anonKeyValue in runsOrderedByStartDate)
{
    this.nodesFlowLayoutPanel.Controls.SetChildIndex(anonKeyValue.RunControl, runsOrderedByStartDate.IndexOf(anonKeyValue));
}

SetChildIndex ne réinitialise pas l'ordre des contrôles dans le panneau Flowlayout. Ainsi, lorsque nous exécutons FlowLayoutPanel.GetNextControl (q, true) , le résultat est incorrect.

Pour l'ordre de contrôle de base, le moyen le plus simple de contrôler l'ordre des contrôles dans flowlayoutPanel consiste à définir la propriété flowlayoutPanel TabStop sur true. Définissez la propriété tabstop des contrôles sur True et définissez l'ordre des tabulations sur l'ordre dans lequel vous souhaitez que les contrôles apparaissent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top