>我创建了一个模板面板,以便在加载包含记录的表单时通过。添加新记录时,我有一个复制该模板面板的方法,然后将其添加到每条记录的面板列表中。当我复制它时,不知何故从我的模板面板中删除了控件,我不知道这是怎么回事。下面列出了执行此操作的代码部分
Panel pn = new Panel()
{
Width = _PNTemp.Width,
Height = _PNTemp.Height,
Left = 0,
Top = 0,
BackColor = _PNTemp.BackColor,
ForeColor = _PNTemp.ForeColor,
AutoScroll = true,
Name = _PNTemp.Name,
Tag = _PrgPanels.Count.ToString()
};
MessageBox.Show(_PNTemp.Controls.Count.ToString());
foreach (Control c in _PNTemp.Controls)
{
pn.Controls.Add(c);
MessageBox.Show(_PNTemp.Controls.Count.ToString());
}
MessageBox.Show(_PNTemp.Controls.Count.ToString());
_PrgPanels.Add(pn);
我把 messagebox.show() 放在 3 点以缩小它发生的位置。第一个显示正确的控件数,第二个和第三个显示控件总数的 1/2。这是为什么呢?
这是因为每个控件只能添加到一个父控件。模板面板中的所有控件都已是模板面板的子控件。当您尝试将这些控件添加到新面板时,这些控件将从模板面板中删除。
根据文档:
一个控件只能分配给一个控件。控件集合位于 时间。如果控件已经是另一个控件的子控件,则它是 在将该控件添加到另一个控件之前将其从该控件中删除。
这意味着您需要创建新控件,而不是在模板中添加这些控件。
另一种方法是创建一个返回模板面板的方法。当你需要模板面板时,只需调用该方法,就会创建一个新面板:
public static Panel CreateTemplatePanel() {
Panel pn = new Panel();
// set properties, add controls...
return pn;
}
一个控件一次只能位于一个面板上。我在您的代码中添加了内联注释,以帮助解释正在发生的事情。
Panel pn = new Panel()
{
Width = _PNTemp.Width,
Height = _PNTemp.Height,
Left = 0,
Top = 0,
BackColor = _PNTemp.BackColor,
ForeColor = _PNTemp.ForeColor,
AutoScroll = true,
Name = _PNTemp.Name,
Tag = _PrgPanels.Count.ToString()
};
MessageBox.Show(_PNTemp.Controls.Count.ToString());
//all the controls are still inside _PNTemp
foreach (Control c in _PNTemp.Controls)
{
pn.Controls.Add(c);
MessageBox.Show(_PNTemp.Controls.Count.ToString());
//Each time this runs you remove a control from _PNTemp to pn.
}
//All the controls moved from _PnTemp to pn
MessageBox.Show(_PNTemp.Controls.Count.ToString());
_PrgPanels.Add(pn);