2009-01-08 50 views
11

Tôi đang gặp sự cố khi sử dụng flowlayoutPanel trong ứng dụng biểu mẫu C#. Những gì tôi về cơ bản có là một bảng điều khiển bố trí dòng chảy có 3 phần.Sắp xếp lại các điều khiển trong bảng điều khiển bố cục luồng

MụC# 1 là một tập hợp của 2 điều khiển .. hai điều khiển thả xuống, họ luôn luôn theo thứ tự, luôn luôn có thể nhìn thấy trong tất cả các trường

MụC# 2 là một tập hợp của 5 điều khiển khác nhau ... dựa trên một loạt các yếu tố, 1 trong 5 điều khiển được hiển thị, tất cả những người khác đều có Hiển thị đúng được đặt thành false

Phần # 3 là một bộ 3 điều khiển .. như Phần # 1 chúng luôn trong cùng một thứ tự và luôn hiển thị.

Vì vậy, điều này tóm tắt là Phần # 2 có thể thay đổi, các phần khác là tĩnh.

Sự cố xảy ra với Phần # 2 ... khi tôi thay đổi mức hiển thị của bất kỳ điều khiển nào chúng xuất hiện tốt (IE ... Phần 1 rồi Mục 2, Phần 3) ... XIN khi tôi đặt kiểm soát combobox để được hiển thị .... trong trường hợp đó, và ONLY trong trường hợp đó .. thứ tự trở thành (Phần 1 rồi Phần 3 rồi Phần 2) ... Tôi không thể hiểu được điều gì sẽ khiến cho việc đặt hàng bị loại bỏ đồng bộ trong trường hợp đó. Điều tôi làm cơ bản ở đầu phương pháp của tôi là đặt TẤT CẢ các điều khiển thành Hiển thị = false ... sau đó tôi đặt Phần 1 Hiển thị = true ... sau đó lặp qua các điều kiện của Phần 2 và đặt các điều khiển thích hợp Hiển thị = true và cuối cùng đặt Section 3 controls Visible = true.

Có ai có bất kỳ trải nghiệm nào với thứ tự kiểm soát bảng điều khiển bố cục luồng không? Tôi không thể tìm ra những gì đang xảy ra cho ComboBox.

Trả lời

5

Có thể thả thả một flowlayoutpanel dễ dàng hơn trong phần 2, sau đó thả các điều khiển phần 2 của bạn vào đó? Bằng cách đó, các điều khiển hiển thị trong bảng điều khiển trên cùng của bạn không bao giờ thay đổi và bạn sẽ không phải lo lắng về việc đặt hàng.

26

Lưu lượng bên trongLayoutPanel.Controls là một hàm phương thức được gọi là SetChildIndex (Control c, int index) cho phép bạn đặt đối tượng thành chỉ mục cụ thể.

Vì FlowLayoutPanel sử dụng chỉ mục của điều khiển để xác định thứ tự để vẽ chúng, bạn có thể đặt chỉ số này thành chỉ mục kiểm soát bạn muốn trao đổi, và nó sẽ tăng chỉ số điều khiển lên một và sau đó.

Dưới đây là đoạn trích từ blog của tôi về PictureBoxes sắp xếp lại trong một FlowLayoutPanel

// thêm FlowLayoutPanel trên Winform - tên 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 không thiết lập lại trật tự của các điều khiển trong bảng điều khiển FlowLayout . Vì vậy, khi chúng tôi thực hiện FlowLayoutPanel.GetNextControl(q, true) đầu ra không chính xác.

+0

Bạn cũng cần thay đổi TabOrder. Bạn cũng có thể thiết lập điều này khi chỉ mục thay đổi. –

2

Bạn có thể sắp xếp lại các điều khiển trên flowpanel, thay đổi thuộc tính cha mẹ của các điều khiển và gán lại thuộc tính mẹ với thứ tự mà bạn cần.

1

Hãy thử giải pháp chung này, nơi bạn có thể sắp xếp bạn điều khiển theo thuộc tính trong điều khiển người dùng.

// 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)); 
} 
Các vấn đề liên quan