2009-01-08 22 views
11

Ich habe Probleme mit dem FlowlayoutPanel in einer C# -Winform-Anwendung. Was ich im Grunde habe, ist ein Flow-Layout-Panel, das 3 Abschnitte hat.Neuordnen von Steuerelementen in einem Flow-Layout-Panel

Abschnitt # 1 ist ein Satz von 2 steuert .. zwei Drop-Down-Kontrollen, sie immer in derselben Reihenfolge sind, immer sichtbar in allen Fällen

Abschnitt # 2 ist ein Satz von 5 verschiedenen Kontrollen ... basierend Bei einer Reihe von Faktoren wird 1 der 5 Steuerelemente sichtbar gemacht, alle anderen haben die sichtbare Eigenschaft auf "falsch" gesetzt

Abschnitt 3 ist ein Satz von 3 Steuerelementen .. wie Abschnitt 1 sind sie immer in der gleichen Reihenfolge und immer sichtbar.

Also was läuft darauf hinaus, dass Abschnitt # 2 ist variabel, die anderen sind statisch.

Das Problem kommt mit Abschnitt # 2 ... Wenn ich die Sichtbarkeit der Steuerelemente ändern, erscheinen sie gut (IE ... Abschnitt 1, dann Abschnitt 2, dann Abschnitt 3) ... AUSSER wenn ich den Combobox Kontrolle sichtbar zu sein .... in diesem Fall, und nur in diesem Fall .. die Reihenfolge wird (Abschnitt 1, dann Abschnitt 3, dann Abschnitt 2) ... Ich kann nicht herausfinden, was dazu führen würde, dass die Bestellung aus sein Synchronisation in genau diesem Fall.

Was ich am Anfang meiner Methode grundsätzlich tun, ist alle Steuerelemente auf Visible = false gesetzt ... dann setze ich Abschnitt 1 Visible = true ... dann Schleife die Bedingungen von Abschnitt 2 und setzen Sie die entsprechenden Steuerelemente sichtbar = true und setze schließlich die Steuerelemente von Abschnitt 3 sichtbar = wahr.

Hat jemand Erfahrung mit der Bestellung der Strömungslayoutpanelsteuerung? Ich kann nicht herausfinden, was für die ComboBox passiert.

Antwort

5

Ist es vielleicht einfacher, ein anderes Flowlayoutpanel für Abschnitt 2 einzulegen, und dann die Section 2-Steuerelemente in das Feld zu legen? Auf diese Weise ändern sich die sichtbaren Steuerelemente in Ihrem oberen Bedienfeld nicht und Sie müssen sich keine Sorgen über die Bestellung machen.

26

Inside FlowLayoutPanel.Controls ist eine Methodenfunktion namens SetChildIndex (Control c, int index), mit der Sie ein Objekt auf einen bestimmten Index setzen können. Da FlowLayoutPanel die Indizes der Steuerelemente verwendet, um zu bestimmen, in welcher Reihenfolge sie gezeichnet werden sollen, können Sie dies auf den Index des Steuerelements einstellen, mit dem Sie tauschen möchten. Dadurch wird der Steuerindex um eins und danach erhöht.

ist hier Schnipsel aus meinem blog von Neuordnungs PictureBox in einem Flowlayoutpanel

// hinzufügen Flowlayoutpanel auf einem Winform - namens 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 nicht die Reihenfolge der Steuerelemente in der Flowpanel zurückgesetzt . Wenn wir also FlowLayoutPanel.GetNextControl(q, true) ausführen, ist die Ausgabe nicht korrekt.

+0

Sie müssen auch die TabOrder ändern. Sie können dies einstellen, wenn sich der Index ebenfalls ändert. –

2

Sie können die Steuerelemente im Flowpanel neu anordnen, die übergeordneten Eigenschaften der Steuerelemente ändern und die übergeordneten Eigenschaften in der von Ihnen benötigten Reihenfolge neu zuweisen.

1

Probieren Sie diese allgemeine Lösung aus, in der Sie die Steuerelemente anhand einer Eigenschaft im Benutzersteuerelement sortieren können.

// 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)); 
} 
Verwandte Themen