2011-09-16 160 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