Domanda

Sto riscontrando problemi con l'utilizzo di flowlayoutPanel in un'applicazione winform C #. Quello che fondamentalmente ho è un pannello di layout di flusso che ha 3 sezioni.

La sezione 1 è un insieme di 2 controlli .. due controlli a discesa, sono sempre nello stesso ordine, sempre visibili in tutte le istanze

La sezione # 2 è un insieme di 5 diversi controlli ... in base a una serie di fattori, 1 dei 5 controlli è reso visibile, tutti gli altri hanno la proprietà Visibile impostata su false

La Sezione # 3 è un insieme di 3 controlli .. come la Sezione # 1 sono sempre nello stesso ordine e sempre visibili.

Quindi ciò che si riduce è che la Sezione 2 è variabile, le altre sono statiche.

Il problema si presenta con la Sezione # 2 ... quando cambio la visibilità di uno qualsiasi dei controlli, questi appaiono bene (IE ... Sezione 1 quindi Sezione 2 quindi Sezione 3) ... SALVO quando imposto la casella combinata controllo per essere visibile .... in quel caso, e SOLO in quel caso .. l'ordine diventa (Sezione 1 quindi Sezione 3 quindi Sezione 2) ... Non riesco a capire cosa causerebbe l'ordinamento sincronizzare solo in questo caso.

Quello che faccio sostanzialmente all'inizio del mio metodo è impostare TUTTI i controlli su Visibile = falso ... quindi ho impostato la Sezione 1 Visibile = vero ... quindi eseguo il ciclo attraverso le condizioni della Sezione 2 e imposto i controlli appropriati Visibile = true e infine impostare i controlli della Sezione 3 Visible = true.

Qualcuno ha qualche esperienza con l'ordinamento dei controlli del pannello di layout del flusso? Non riesco a capire cosa sta succedendo per il ComboBox.

È stato utile?

Soluzione

Potrebbe essere più semplice rilasciare un altro pannello di flusso in per la sezione 2, quindi rilasciare i controlli della sezione 2 in quello? In questo modo, i controlli visibili nel pannello superiore non cambiano mai e non dovrai preoccuparti di ordinare.

Altri suggerimenti

All'interno di FlowLayoutPanel.Controls è presente una funzione di metodo chiamata SetChildIndex (Control c, int index) che consente di impostare un oggetto su un indice specifico.

Poiché FlowLayoutPanel utilizza gli indici di controllo per determinare l'ordine in cui attirarli, è possibile impostarlo su qualsiasi indice di controllo che si desidera scambiare, e verrà eseguito il bump che controlla l'indice in su di uno, e ognuno successivamente.

Ecco lo snippet dal mio blog di riordinamento dei PictureBox in un FlowLayoutPanel.

Aggiungi un FlowLayoutPanel su un WinForm chiamato 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);
    }
}

Puoi riordinare i controlli sul pannello di flusso, modificando la proprietà padre dei controlli e riassegnando la proprietà padre con l'ordine che ti serve.

Prova questa soluzione generica in cui puoi ordinare i controlli in base a una proprietà nel controllo utente.

// 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 non reimposta l'ordine dei controlli nel pannello flowlayout. Quindi, quando eseguiamo FlowLayoutPanel.GetNextControl (q, true) l'output non è corretto.

Per l'ordinamento dei controlli di base, il modo più semplice per controllare l'ordine dei controlli in flowlayoutPanel è impostare la proprietà Tablaytop di flowlayoutPanel su true. Impostare la proprietà tabstop dei controlli su True e impostare l'ordine delle schede nell'ordine in cui si desidera vengano visualizzati i controlli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top