2011-09-16 275 views
1

我想製作一個控件列表。爲此,我使用了流佈局面板和自定義項目。閱讀XML文件後,我用我的項目填充流佈局面板。對於少數項目,所有接縫都可以,但對於流佈局面板中的371個項目,某些項目會出錯。在流佈局面板的底部,缺少95個項目,並且接縫重疊。我認爲,這個項目的空間仍然被創建。我附上了一個效果產生的屏幕。控件是在數組中創建的,然後我迭代該數組以將控件添加到流佈局面板。流佈局面板問題

http://img510.imageshack.us/img510/3201/screen2011916213527199.jpg

謝謝。

LE:

public delegate void AddHistoryItemDelegate(Control itm); 
     public void AddHistoryItem(Control itm) 
     { 
      if (InvokeRequired) 
      { 
       Invoke(new AddHistoryItemDelegate(AddHistoryItem), new object[] { itm }); 
      } 
      else 
      { 
       flowLayoutPanel1.Controls.Add(itm); 
      } 
     } 
foreach (Control c in histroryItems) 
      { 
       controls++; 
       backgroundWorkerLoadHistory.ReportProgress(controls); 
       //flowLayoutPanel1.Controls.Add(c); 
       AddHistoryItem(c); 
      } 

的代表是有,因爲這一切都發生在一個單獨的線程。 histroryItems是一個控件列表。 LE:如果它是計數,我觀察到,如果我從列表中刪除一個項目,在列表加載之後,它將被安排。嘗試一些小技巧,看看在線程末尾添加和刪除控件是否有效。添加控件後

 this.flowLayoutPanel1.ResumeLayout(); 

+0

C#沒有一個FlowPanel。或任何Conbtrols。 –

+0

是關於WinForms中的FlowLayoutPanel。遺憾的是缺少標籤。 – andySF

回答

3

你可以試試這個:

 this.flowLayoutPanel1.SuspendLayout(); 

添加控件之前。也許以下應連續進行:

 this.flowLayoutPanel1.PerformLayout(); 

和/或:

 this.flowLayoutPanel1.Refresh(); 
1

我發現,我不得不這樣做:

private void flpChoices_Scroll(object sender, ScrollEventArgs e) 
{ 
    Control c=flpChoices.GetChildAtPoint(new Point(10, 10), GetChildAtPointSkip.None); 
    if (c == null) flpChoices.PerformLayout(); 
} 

哪裏flpChoices是我FlowLayout Panel。現在我不認爲滾動事件是由鼠標滾輪移動觸發的,所以我不知道該怎麼做。

編輯:有一個隱藏的(而不是在屬性窗口),甚至滾輪:

void flpChoices_MouseWheel(object sender, MouseEventArgs e) 
{ 
    Control c=flpChoices.GetChildAtPoint(new Point(10, 10), GetChildAtPointSkip.None); 
    if (c == null) flpChoices.PerformLayout(); 

} 
+0

感謝您的信息。我會試着看看它是如何工作的。但是,我更改了設計,並使用了「加載更多...」按鈕:) – andySF

+0

這是否正常工作?你有一個例子嗎?我對這樣做的黑客方式並不滿意。 – Plater