Vra

Ek het probleme met die gebruik van die flowlayoutPanel in 'n C # winform aansoek. Wat ek het basies is 'n vloei uitleg paneel wat 3 afdelings het.

Artikel # 1 is 'n versameling van 2 kontroles .. twee dropdown beheer, hulle is altyd in dieselfde volgorde, altyd sigbaar in alle gevalle

Artikel # 2 is 'n versameling van 5 verskillende kontroles ... gebaseer op 'n reeks van faktore, 1 van die 5 kontroles is sigbaar gemaak, al die ander het die sigbare propert vals gestel

Artikel # 3 is 'n stel van 3 kontrole .. soos Afdeling # 1 hulle is altyd in dieselfde volgorde en altyd sigbaar.

Wat hierdie kom neer op is dat Artikel # 2 is 'n veranderlike, die ander is staties nie.

Die probleem kom met Artikel # 2 ... toe ek die sigbaarheid van enige van die kontroles verander hulle verskyn net mooi (IE ... Artikel 1 dan Artikel 2 dan Artikel 3) ... behalwe wanneer ek stel die comboboks beheer te sigbaar wees .... in daardie geval, en slegs in daardie geval .. die einde word (Artikel 1 dan Artikel 3 dan Artikel 2) ... Ek kan nie uitvind wat sou veroorsaak dat die bestel te wees uit pas nie in net so 'n geval.

Wat ek basies doen aan die begin van my metode is ingestel ALLE beheer sigbaar = vals ... dan stel ek Afdeling 1 Sigbare = true ... dan loop deur die voorwaardes van Artikel 2 en stel die nodige kontrole Sigbare = ware en uiteindelik stel Artikel 3 kontroles Sigbare = true.

Is daar iemand enige ervaring met die vloei uitleg control panel bestel? Ek kan nie uitvind wat gebeur vir die ComboBox.

Was dit nuttig?

Oplossing

Kan dit makliker wees om 'n ander flowlayoutpanel val in Artikel 2, dan val jou artikel 2 kontroles in wat? Op dié manier, die sigbare kontrole in jou boonste paneel nooit verander nie en jy sal nie hoef te bekommer oor die bestel.

Ander wenke

Binne FlowLayoutPanel.Controls is 'n metode funksie genoem SetChildIndex(Control c, int index) wat jou toelaat om 'n voorwerp te stel om 'n spesifieke indeks.

Sedert FlowLayoutPanel gebruik indekse beheer om te bepaal wat om hulle in te trek, kan jy dit stel om na gelang beheer se indeks jy wil ruil met, en dit sal stamp dat beheermaatreëls indeks deur een en elkeen daarna.

Hier is n uittreksel uit my blog van herordening PictureBoxes in 'n FlowLayoutPanel.

Voeg 'n FlowLayoutPanel op 'n WinForm vernoem 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);
    }
}

Jy kan beheer oor flowpanel rangskik, die verandering van ouer eiendom van kontrole en gehou indiensneming ouer eiendom met die volgorde wat jy nodig het.

Probeer hierdie generiese oplossing waar jy kan sorteer jy beheer volgens 'n eiendom in die gebruiker beheer.

// 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 nie die einde van die kontrole te herstel in die flowlayout paneel. So wanneer ons FlowLayoutPanel.GetNextControl(q, true) voer die produksie is nie korrek nie.

Vir basiese beheer bestel, die eenvoudigste manier om die einde van die kontrole in die flowlayoutPanel beheer is om die eiendom flowlayoutPanel TabStop om waar te stel. Stel die kontroles tabstop eiendom te True en stel die blad om die volgorde waarin jy die beheer te verskyn.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top