2009-09-01 49 views
5

Giả sử bạn có hai số Control s, Alice và Bob và bạn muốn trao đổi vị trí của chúng. Do đó, tôi có nghĩa là sau khi hoán đổi:C#: Cách hoán đổi vị trí của hai điều khiển winform

  • Nếu họ sống cùng một số ControlCollection, Alice phải có chỉ mục của Bob và ngược lại.
  • Nếu trong khác nhau ControlCollection s, Alice phải có cùng chỉ mục với Bob, nhưng ở trong Bobs ControlCollection và ngược lại.

Bạn sẽ làm như thế nào? Tôi là một chút không chắc chắn làm thế nào để giải quyết tốt nhất này vì cách thức các phương pháp ControlCollection làm việc. Ví dụ bằng cách sử dụng phương thức Remove để xóa điều khiển sẽ thay đổi chỉ mục của tất cả các điều khiển đến sau bộ sưu tập. SetChildIndex hoạt động theo cách tương tự.

Edit: Các điều khiển cha mẹ của Alice và Bob là dòng chảy các tấm bố trí. Đây là lý do tại sao tôi muốn trao đổi chỉ mục của họ mà sẽ có hiệu lực trao đổi vị trí của họ trong bảng điều khiển bố cục lưu lượng.

Trả lời

6

Đối với trường hợp đơn giản, nơi cả hai điều khiển đang trên cùng một FlowLayoutPanel, sử dụng phương pháp SetChildIndex trên Controls.

Something như thế này ...

var alphaIndex = panel.Controls.IndexOf(controlAlpha); 
var betaIndex = panel.Controls.IndexOf(controlBeta); 
panel.Controls.SetChildIndex(controlAlpha, betaIndex); 
panel.Controls.SetChildIndex(controlBeta, alphaIndex); 

Lưu ý: Tôi đã không được xử lý chuỗi đây đúng - bạn cần phải đặt sự kiểm soát trước đó vào vị trí đầu tiên, nếu không khi lần thứ hai được di chuyển về phía trước của nó, chỉ số kết quả sẽ là một chỉ số quá cao. Nhưng đó là một bài tập cho người đọc.

Đối với trường hợp phức tạp hơn, nơi các điều khiển khác nhau FlowLayoutPanel s, mã đơn giản hơn (trình tự không quan trọng lắm) và phức tạp hơn (mỗi điều khiển cần được loại bỏ khỏi một bảng điều khiển và được thêm vào).

0

Tôi không nghĩ bạn có thể làm chính xác những gì bạn đang cố gắng đạt được. Nhưng yêu cầu của bạn có vẻ kỳ lạ đối với tôi: bạn hoàn toàn có thể trao đổi trực quan hai điều khiển trong một biểu mẫu mà không có bất kỳ ràng buộc nào về chỉ mục tương ứng của chúng trong số ControlCollection của phụ huynh.

Gần nhất bạn có thể nhận được sẽ được lưu trữ điều khiển của bạn trong một Panel:

  • Bạn sẽ phải PanelAPanelB.
  • Lúc đầu, PanelA sẽ chứa AlicePanelB sẽ chứa Bob.
  • Khi trao đổi, lưu trữ Bob vào PanelAAlice thành PanelB.

AliceBob sẽ không xuất hiện trực tiếp trong ControlCollection tuy nhiên, chỉ có Panel s sẽ.

+0

Rất tiếc, đáng lẽ phải nói rằng các bảng mà chúng nằm trong đó là các bảng bố cục luồng. Vì vậy, đó là lý do tại sao tôi cần phải trao đổi chỉ số của họ để trao đổi vị trí trực quan của họ. Đã sửa câu hỏi của tôi =) – Svish

-1

Tôi muốn nói rằng bạn phải xóa tất cả các điều khiển từ ControlCollection (s) bạn đang làm việc và lưu trữ chúng vào (các) cấu trúc dữ liệu tuân theo thứ tự của các phần tử (có thể là SortedList?).

Trong trường hợp đầu tiên, bạn muốn sau đó trao đổi Alice và Bob trong SortedList và sau đó lại thêm tất cả các điều khiển từ SortedList trở lại vào ControlCollection.

Trường hợp thứ hai sẽ tương tự như trường hợp đầu tiên ngoại trừ việc bạn có 2 SortedList s và bạn muốn đổi Alice và Bob giữa chúng.

+1

Thuộc tính 'Điều khiển' hiện diện trên mọi điều khiển vùng chứa không phải là một danh sách đơn giản - đó là một đối tượng riêng biệt ở bên phải riêng của nó (Control.ControlCollection - http://msdn.microsoft.com/en-us/ library/system.windows.forms.control.controlcollection (VS.71) .aspx) và nó cung cấp hỗ trợ trực tiếp cho việc di chuyển mọi thứ xung quanh. Nếu bạn xóa và thêm lại tất cả các điều khiển theo cách bạn đề xuất, giao diện người dùng sẽ nhấp nháy thứ gì đó khủng khiếp - và mã sẽ bị ** chậm **. – Bevan

+0

Đồng ý, nhưng nó sẽ giải quyết vấn đề của mình. Tôi quên rằng nó có thể sử dụng 'SetChildIndex' theo cách yopu trả lời, vì vậy cảm ơn cho điều đó. :) –

1
Control bobParent = bob.Parent; 
Control aliceParent = alice.Parent; 
int bobIndex = bobParent.Controls.GetChildIndex(bob); 
int aliceIndex = aliceParent.Controls.GetChildIndex(alice); 
bobParent.Controls.Add(alice); 
aliceParent.Controls.Add(bob); 
bobParent.Controls.SetChildIndex(alice, bobIndex); 
aliceParent.Controls.SetChildIndex(bob, aliceIndex); 

Có lẽ không phải là con đường ngắn nhất, nhưng nó phải làm việc ...

0

Tôi tình cờ gặp phải điều gì đó trong khi xem xét vấn đề này. Tôi thấy rằng Control.BringToFront() thực sự thay đổi vị trí trong ControlCollection.

Vì vậy:

foreach(Control _control in this.Controls) 
    _control.BringToFront() 

sẽ đảo ngược thứ tự trong ControlCollection.

Các vấn đề liên quan