Frage

Ich habe Probleme bei der Flowlayoutpanel in einer C # winform Anwendung. Was ich im Grunde haben ein Ablauf Layout-Panel, das 3 Abschnitte hat.

Sektion # 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 ... auf einer Reihe von Faktoren, 1 der 5 Kontrollen sichtbar gemacht wird, alle andere die Visible propert auf false gesetzt

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

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

Das Problem kommt mit Abschnitt # 2 ..., wenn ich die Sichtbarkeit eines der Steuerelemente ändern sie einfach gut erscheinen (IE ... Abschnitt 1 dann Abschnitt 2 dann Abschnitt 3) ... außer, wenn ich die Combobox eingestellt Kontrolle sichtbar zu sein .... in diesem Fall, und nur in diesem Fall .. die Reihenfolge wird (§ 1 dann Abschnitt 3 dann Abschnitt 2) ... ich kann nicht herausfinden, was die Ordnung heraus verursachen würde von Synchronisierung in nur diesen Fall.

Was grundsätzlich am Anfang meiner Methode, die ich tun gesetzt alle Regler auf Visible = false ... dann setze ich Abschnitt 1 Visible = true ... dann Schleife durch die Bedingungen des § 2 und legen Sie die entsprechenden Kontrollen Visible = wahr und schließlich Abschnitt 3 Kontrollen Visible = true gesetzt.

Hat jemand Erfahrung mit dem Fluss Layout Control Panel Bestellung? Ich kann nicht herausfinden, was für die ComboBox geschieht.

War es hilfreich?

Lösung

Könnte es einfacher sein, eine andere in Flowlayoutpanel für 2 Abschnitt fallen, dann Abschnitt 2 Kontrollen in das fallen lassen? Auf diese Weise die sichtbaren Kontrollen im oberen Platte nie ändern, und Sie werden nicht über Bestellung kümmern.

Andere Tipps

Innerhalb FlowLayoutPanel.Controls ist eine Methode, Funktion SetChildIndex(Control c, int index) genannt, die Sie ein Objekt auf einen bestimmten Index festlegen können.

Da Flowlayoutpanel verwendet Kontrolle der Indizes zu bestimmen, in welcher Reihenfolge sie in ziehen, können Sie dies auf Unabhängig davon, welche Kontrolle des Index, mit dem Sie tauschen wollen, sind, und es wird stoßen, dass die Kontrollen Index nach dem anderen, und jeder danach.

Hier ist Schnipsel aus meinem Blog rel="nofollow von PictureBox in einem Flowlayoutpanel Nachbestellung.

Fügen Sie einen 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);
    }
}

Sie können Steuerelemente auf Flow neu anordnen, übergeordnete Eigenschaft von Steuerelementen zu ändern und Neuzuweisung übergeordnete Eigenschaft mit der Reihenfolge, die Sie benötigen.

Versuchen Sie, diese generische Lösung, wo Sie Sie Steuerelemente nach einer Eigenschaft in der Benutzersteuerung sortieren.

// 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 nicht zurückgesetzt, die Reihenfolge der Steuerelemente in der Flow Panel. Wenn wir also FlowLayoutPanel.GetNextControl(q, true) führen die Ausgabe nicht korrekt ist.

Für die Grundsteuer Bestellung, der einfachste Weg, um die Reihenfolge der Steuerelemente in der Flowlayoutpanel zu steuern, ist die Flowlayoutpanel TabStop-Eigenschaft auf true zu setzen. Stellen Sie die Kontrollen tabstop Eigenschaft auf True und stellen Sie die Registerkarte, um die Reihenfolge, in der die Steuerelemente angezeigt werden soll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top