2009-01-08 7 views
11

Je rencontre des problèmes lors de l'utilisation de flowlayoutPanel dans une application winform C#. Ce que j'ai essentiellement est un panneau de disposition de flux qui a 3 sections.Réorganisation des contrôles dans un panneau de disposition de flux

Section # 1 est un ensemble de 2 contrôles .. deux contrôles déroulantes, ils sont toujours dans le même ordre, toujours visible dans tous les cas

Section # 2 est un ensemble de 5 contrôles différents ... en fonction sur une série de facteurs, 1 des 5 contrôles est rendu visible, tous les autres ont le paramètre Visible mis à

La section 3 est un ensemble de 3 contrôles. Comme la section 1, ils sont toujours dans le même ordre et toujours visible. Donc, cela revient à dire que la section 2 est variable, les autres sont statiques.

Le problème vient avec la section # 2 ... lorsque je change la visibilité de l'un des contrôles, ils apparaissent très bien (IE ... Section 1 puis Section 2 puis Section 3) ... SAUF quand je définis le La commande combobox est visible ... dans ce cas, et seulement dans ce cas ... l'ordre devient (Section 1 puis Section 3 puis Section 2) ... Je n'arrive pas à comprendre ce qui pourrait entraîner la commande de synchronisation 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 je règle Section 1 Visible = true ... puis boucle les conditions de la Section 2 et définit les contrôles appropriés Visible = true et enfin défini les contrôles de la section 3 Visible = true.

Est-ce que quelqu'un a de l'expérience avec la commande de contrôle de panneau de disposition de flux? Je ne peux pas comprendre ce qui se passe pour le ComboBox.

Répondre

5

Peut-il être plus facile de déposer un autre panneau de flux dans la section 2, puis d'y déposer vos commandes de section 2? De cette façon, les contrôles visibles dans votre panneau supérieur ne changent jamais et vous ne devrez pas vous inquiéter de commander.

26

Inside FlowLayoutPanel.Controls est une fonction de méthode appelée SetChildIndex (Control c, int index) qui vous permet de définir un objet sur un index spécifique. Étant donné que FlowLayoutPanel utilise les indices de contrôle pour déterminer dans quel ordre les dessiner, vous pouvez le définir sur l'index de contrôle avec lequel vous voulez échanger, et il augmentera l'index de contrôle d'un, et tous les suivants.

est ici extrait de mon blog de PictureBoxes réordonnancement dans un FlowLayoutPanel

// ajouter FlowLayoutPanel sur un 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); 
     } 



} 
0

SetChildIndex ne réinitialise pas l'ordre des commandes dans le panneau FlowLayout . Ainsi, lorsque nous effectuons , la sortie n'est pas correcte.

+0

Vous devez également modifier TabOrder. Vous pouvez le définir lorsque l'index change également. –

2

Vous pouvez réorganiser les contrôles sur le flowpanel, en modifiant la propriété parent des contrôles et en réaffectant la propriété parent avec l'ordre dont vous avez besoin. Essayez cette solution générique où vous pouvez trier les contrôles en fonction d'une propriété dans le contrôle de l'utilisateur.

1

// 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)); 
} 
Questions connexes