为什么将控件从一个面板复制到下一个面板时会删除控件



>我创建了一个模板面板,以便在加载包含记录的表单时通过。添加新记录时,我有一个复制该模板面板的方法,然后将其添加到每条记录的面板列表中。当我复制它时,不知何故从我的模板面板中删除了控件,我不知道这是怎么回事。下面列出了执行此操作的代码部分

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);

最新更新