2010-02-08 49 views
3

我在我的代碼中有一席之地,我正在動態地將控件添加到Top-Down排列的FlowLayoutPanel中。我需要控件以某種順序出現,所以我每次都在做的是清除FlowLayoutPanel.Controls集合,然後按照我希望它們出現的順序添加每個子控件。我的代碼是這樣的:將控件添加到FlowLayoutPanel時發生意外的索引更改

private void arrangement1() 
{ 
    flowLayoutPanel1.Controls.Clear(); 
    flowLayoutPanel1.Controls.Add(control1); 
    flowLayoutPanel1.Controls.Add(control2); 
    flowLayoutPanel1.Controls.Add(control3); 
} 

大多數情況下,這個工程很好。但是,有一個特定的控件在其後面添加其他控件時不會保持它在控件集合中的位置。例如在以下代碼段中:

private void arrangement2() 
{ 
    flowLayoutPanel1.Controls.Clear(); 
    flowLayoutPanel1.Controls.Add(control1); 
    flowLayoutPanel1.Controls.Add(movingControl); 
    //movingControl current is at index = 1 in Controls. 
    flowLayoutPanel1.Controls.Add(control2); 
    //control2 is now at index = 1, movingControl got bumped to index = 2 in Controls. 
    flowLayoutPanel1.Controls.Add(control3); 
    //control3 is now at index =2, movingControl got bumped to index = 3 in Controls. 
} 

這隻發生在首次將moveControl添加到控件時。如果我回去再次打電話給安排1和安排2。該控件將出現在預期的順序:

  • 控制1
  • movingControl
  • 控制2
  • CONTROL3

這似乎是在Controls.Add被代碼中的錯誤。無論是那個還是.Add行爲的文檔都是不完整的,因爲它並不總是添加到集合的末尾。有沒有人對這種情況發生的原因有所瞭解。最明顯的「修復」,就是隻要致電:

arrangement2(); 
arrangement1(); 
arrangement2(); 

然而,這似乎是一個非常貧窮的解決方案,其他一些潛在的問題。

在此先感謝您的幫助!

編輯:請注意,這些控件中的每一個都是自定義視圖類的成員,因此它們在控件集合清除後仍然存在。但是,這些控件不會以任何有序集合的形式存儲。他們只是這個自定義類的成員。上面顯示的代碼正常工作,如圖所示。但是,在我的GUI程序中,它具有所描述的錯誤行爲。我會發布更多的代碼,如果我有任何想法會有所幫助,但有很多代碼涉及這些peices。這是爲所描述的操作執行的所有代碼。

我真正在尋找的是什麼可能的情況導致Controls.Add添加控件不是在集合的最後一個索引。特別是在調用Clear()和NO Remove()調用之後。

+0

有一個類似的問題 - 而不是使用Controls.Add(按鈕)我使用Button.parent = flowLayoutPanel。這樣做會導致更改順序 - 切換到controls.add將所有內容都按正確順序排列。 – 2010-09-09 17:42:52

回答

1

首先運行Arrangement1給我: 控制1 控制2 CONTROL3

運行arrangement2給我: 控制1 movingcontrol 控制2 CONTROL3

您的代碼,純粹因爲它是貼了,對我的作品。

但是,最近我遇到了類似的問題。我將控件放在列表中,然後通過此方法將它們添加到流佈局中。從列表中刪除單個項目,然後添加一個新控件不會在最後插入新控件,它會替換已刪除項目留下的空白區域。

因此,總之,我懷疑這是你沒有發佈的東西,可能在哪裏存儲控件本身?你將它們存儲在一個數組或列表中?

+0

如上所述。這些控件是通過視圖控制器類操作的自定義視圖類的成員。如果我能縮小要發佈的代碼,我會發布更多的代碼。我想我正在尋找洞察什麼可能導致添加到插入的索引而不是集合的最後一個索引,特別是在清除而不是任何刪除之後。 – 2010-02-08 18:01:09

+0

我明白了,在這裏簡化代碼來形成一個可理解的問題一定很難。 您存儲控件實例的類型可能會影響訂單。例如,在列表或字典中,沒有「訂單」或排序的概念。如果它在數組中,那麼數組中的位置就是順序。但是,如果用戶可以逐個刪除並重新添加東西,那麼您在我的初始回覆中會遇到同樣的情況。 – Roast 2010-02-08 19:17:22

0

只是切換moveControl的可見性會不會更容易?

但我想這個問題的答案是基於您的例子,例如,如果有更多的清理是要去那麼這可能不適用。

結合可見性切換,您也可以使用ControlCollection.SetChildIndex()來代替,這似乎更合適,似乎更有可能產生更平滑的重新排序。

相關問題