2009-01-08 11 views
11

Mam problem z używaniem flowlayoutPanel w aplikacji WinFile C#. W zasadzie mam tylko panel z układem przepływu, który ma 3 sekcje.Zmiana kolejności elementów sterujących w panelu układu przepływu

Sekcja nr 1 to zestaw 2 kontrole .. dwie kontrole rozwijanych, są zawsze w tej samej kolejności, zawsze widoczny we wszystkich przypadkach

Sekcja nr 2 to zestaw 5 różnych kontroli na podstawie ... na szereg czynników, jeden z 5 elementów sterujących jest widoczny, wszystkie pozostałe mają Widoczny zestaw właściwości fałszywy

Sekcja # 3 to zestaw 3 elementów sterujących .. takich jak sekcja # 1 są one zawsze w tej samej kolejności i zawsze widoczne.

Więc co to sprowadza się do tego, że sekcja nr 2 jest zmienna, inni są statyczne.

Problem pojawia się w sekcji # 2 ... kiedy zmieniam widoczność któregokolwiek z elementów sterujących, które wydają się być w porządku (IE ... Sekcja 1, a następnie sekcja 2, a następnie sekcja 3) ... Z WYJĄTKIEM, gdy ustawiam kontrolka combobox jest widoczna .... w takim przypadku, a TYLKO w takim przypadku .. zlecenie staje się (sekcja 1, a następnie sekcja 3, a następnie sekcja 2) ... nie mogę określić, co spowodowałoby, że zamówienie się skończyło synchronizacji w tym przypadku.

Co zasadniczo robię na początku mojej metody, ustawia się WSZYSTKIE elementy sterujące na Widoczne = fałsz ... następnie ustawiam Sekcja 1 Widoczny = prawda ... następnie przechodzę przez warunki sekcji 2 i ustawia odpowiednie kontrolki Widoczne = true i na końcu ustaw Sekcję 3 kontrolki Visible = true.

Czy ktoś ma jakieś doświadczenie z zamawianiem paneli sterowania układem przepływu? Nie wiem, co się dzieje w ComboBox.

Odpowiedz

5

Może łatwiej będzie spadać do innego FlowLayoutPanel w punkcie 2, a następnie upuścić rozdział 2 kontrole w tym? W ten sposób widoczne elementy sterujące w górnym panelu nie ulegną zmianie i nie będziesz musiał się martwić o zamawianie.

26

Inside FlowLayoutPanel.Controls jest funkcją metoda zwana setChildIndex (Control c, int index), który pozwala na ustawienie obiektu do określonego indeksu.

Ponieważ FlowLayoutPanel używa indeksów kontrolnych, aby określić kolejność ich losowania, możesz ustawić to na dowolny indeks kontrolki, którego chcesz zamienić, a spowoduje to zwiększenie indeksu o jeden i kolejne.

Oto urywek z mojego blog z zamianom PictureBoxes w FlowLayoutPanel

// dodać FlowLayoutPanel na Winform - nazwie 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 nie resetuje kolejność kontroli w panelu FlowLayout . Więc kiedy wykonujemy FlowLayoutPanel.GetNextControl(q, true), wynik jest niepoprawny.

+0

Należy również zmienić TabOrder. Możesz to ustawić, gdy indeks również się zmieni. –

2

Można zmienić kolejność kontroli flowpanel, zmieniając właściwości nadrzędny kontroli i realokacja mienia rodzic z rzędu, że trzeba.

1

Spróbuj ogólne rozwiązanie, w którym można sortować Ci kontrole według właściwości w kontroli użytkownika.

// 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)); 
} 
Powiązane problemy