2008-11-11 1 views
5

Ich habe ein besonderes Problem mit der Reihenfolge, in der FlowLayoutPanels in die Steuerelemente Eigenschaft des Formulars hinzugefügt werden. Dies ist, was ich versucht habe,Reihenfolge der Steuerelemente in der Eigenschaft Control eines Formulars in C#

Ich habe 7 FlowLayoutPanels in einer C# -Fenster Anwendung von links nach rechts in vertikalen Streifen. Dann markierte ich die Flow-Layouts als 1, 2, 3, ... 7 wieder von links nach rechts. Jetzt in der Lastaufnahme des Formulars, schrieb ich den folgenden Ausschnitt

foreach (FlowLayoutPanel aDaysControl in this.Controls) 
    { 
     MessageBox.Show(aDaysControl.Tag.ToString()); 
    } 

ich Nachrichten erwartet in der Größenordnung von 1, 2, erscheinen ... 7. Aber ich habe es in umgekehrter Reihenfolge (7, 6, ... 1). Könnte mir jemand mit dem Fehler helfen, den ich begangen habe?

Grund der Bestellung hinter Erhaltung

Ich versuche, ein Kalender-Steuerelement mit jeder Zeile zu machen pro Tag entspricht. Wenn ein Monat beginnt von Mittwoch, dann muss ich ein leeres Etikett an die erste Zeile (Montag) und die zweite Zeile (Dienstag) Reihe hinzufügen. So zählt die Reihenfolge etwas

+0

Sie haben meine Antwort kommentiert, dass die Bestellung für Sie wichtig war. Ich bin sehr daran interessiert zu verstehen, warum. Können Sie Ihre Frage bearbeiten, um den Grund zu erklären? Vielen Dank. –

Antwort

3

Blick auf die Reihenfolge, in der sie auf die Form in den yourForm.designer.cs hinzugefügt werden

+0

Ja. Das ist das Problem. Sie wurden in umgekehrter Richtung hinzugefügt. Ich weiß nicht warum. Danke –

0

Ist es wirklich ein Problem?

Solange die Benutzeroberfläche ordnungsgemäß funktioniert (z. B. in Bezug auf die Tab-Reihenfolge), würde ich empfehlen, dass Sie keine Annahmen über die Reihenfolge machen, in der sie aufgelistet werden.

EDIT: Danke für die Erklärung Ihrer Anforderung im Detail. Ich denke, ich würde immer noch empfehlen, nicht die Reihenfolge zu verwenden, in der sie in der Controls-Sammlung gespeichert sind. Es ist immer am besten, diese Implementierungsdetails als "undurchsichtig" zu betrachten. Mit jedem Steuerelement ist ein Tag verknüpft, mit dem Sie das richtige Steuerelement identifizieren können. Um die Verarbeitung zu beschleunigen, könnten Sie ein 7-Element-Array aufzubauen, die die Kontrollen durch die Ordnungs verweist:

FlowLayoutPanel[] panels = new FlowLayoutPanel[7]; 

foreach(FlowLayoutPanel panel in this.Controls) 
{ 
    panels[(int)panel.Tag] = panel; 
} 

// Now, you can reference the panels directly by subscript: 

panels[2].BackColor = Color.Aquamarine; 

Obwohl ich irgendeine Art-Check-in setzen würde diesen Code ein bisschen robuster zu machen!

+0

Aber die Reihenfolge __hoes___ Angelegenheit in meinem Fall !! –

1

, wenn Sie den von dem Designer generierten Code sehen Form1.designer.cs es so etwas wie folgen aussehen:

 // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(658, 160); 
     this.Controls.Add(this.flowLayoutPanel7); 
     this.Controls.Add(this.flowLayoutPanel6); 
     this.Controls.Add(this.flowLayoutPanel5); 
     this.Controls.Add(this.flowLayoutPanel4); 
     this.Controls.Add(this.flowLayoutPanel3); 
     this.Controls.Add(this.flowLayoutPanel2); 
     this.Controls.Add(this.flowLayoutPanel1); 
     this.Name = "Form1"; 
     this.Text = "Form1"; 
     this.ResumeLayout(false); 

Note, wie es aufgebaut wurde Du Platte 1 zuerst zugegeben, dann 2 usw. aber Wenn der Code durchläuft, wird zuerst 7 und dann 6 hinzugefügt.

Dieser Code wird in der InitializeComponent() - Funktion gespeichert, die vom Designer generiert wird.

Warum brauchen Sie sie in einer bestimmten Reihenfolge?

Ich würde nicht auf dem Designer verlassen, um die gewünschte Reihenfolge zu halten .. Ich würde die Kontrollen mich selbst sortieren:

 var flowpanelinOrder = from n in this.Controls.Cast<Control>() 
           where n is FlowLayoutPanel 
           orderby int.Parse(n.Tag.ToString()) 
           select n; 

     /* non linq 
     List<Control> flowpanelinOrder = new List<Control>(); 
     foreach (Control c in this.Controls) 
     { 
      if (c is FlowLayoutPanel) flowpanelinOrder.Add(c);     
     } 
     flowpanelinOrder.Sort(); 
     * */ 

     foreach (FlowLayoutPanel aDaysControl in flowpanelinOrder) 
     { 
      MessageBox.Show(aDaysControl.Tag.ToString()); 
     } 
+0

Ich versuche ein Kalendersteuerelement zu erstellen, wobei jede Zeile einen Tag darstellt. Wenn ein Monat von Mittwoch an beginnt, muss ich der ersten (Montag) und der zweiten (Dienstag) Zeile ein leeres Label hinzufügen. Die Reihenfolge ist also wichtig. –

+0

Hmm. Ich war etwas faul. Lerne jetzt die Lektion. –

7

Ich weiß, dass dies eine alte Frage recht ist, aber ...

Sie könnten SetChildIndex verwenden möchten. z.B. this.Controls.SetChildIndex(button1, 0);

1

Was ist, wenn in Zukunft ein anderer Designer die Steuerung entfernt, hinzugefügt usw.? Den Designer immer zu überprüfen ist ein Durcheinander. Es wäre besser, die Steuerelemente in der Containersteuerung zu sortieren, bevor Sie aufzählen. Ich benutze diese Erweiterungsmethode (wenn Sie Linq):

public static List<Control> ToControlsSorted(this Control panel) 
{ 
    var controls = panel.Controls.OfType<Control>().ToList(); 
    controls.Sort((c1, c2) => c1.TabIndex.CompareTo(c2.TabIndex)); 
    return controls; 
} 

Und Sie können:

foreach (FlowLayoutPanel aDaysControl in this.ToControlsSorted()) 
{ 
    MessageBox.Show(aDaysControl.TabIndex.ToString()); 
} 

(oben für TabIndex ist). Wäre trivial nach Tag aus diesem zu sortieren.

Verwandte Themen