我正在尝试列出控件。为此,我使用了流布局面板和自定义项。在读取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:如果它是重要的,我观察到,如果我从列表中删除一个项目,在列表加载后,它就会得到安排。试着看一下在线程末尾添加和删除控件是否有任何影响。
答案 0 :(得分:3)
你可以试试这个:
this.flowLayoutPanel1.SuspendLayout();
在添加控件之前:
this.flowLayoutPanel1.ResumeLayout();
添加控件后。也许应该连续执行以下操作:
this.flowLayoutPanel1.PerformLayout();
和/或:
this.flowLayoutPanel1.Refresh();
答案 1 :(得分: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();
}