控制从旧的父控件中删除,但如果我使用List <control>则不会,为什么?

时间:2016-11-25 13:00:22

标签: c# list web-controls

这可能是关于C#和WebControl行为的一个非常基本的问题。我得到了这个工作,但如果有人能够澄清差异所在的位置会很好。

之前

我有一个带有给定密钥(Guid)和Panel的字典。

var tmpFormButtonPanel = new Panel();
 _formButtonPanelDict.TryGetValue(new Guid(_hiddenField.Value), out tmpFormButtonPanel);

此面板包含WebControl。现在我想将此按钮分配给另一个面板。

if (tmpFormButtonPanel != null)
{
       var tmpControls = new List<Button>();
       foreach (Button tmpButton in tmpFormButtonPanel.Controls)
       {
            tmpControls.Add(tmpButton);
       }
       tmpControls.Reverse();
       foreach (var tmpButton in tmpControls)
       {
           tmpButton.AddCssClass("xy");
           _buttonPanel.Controls.Add(tmpButton);
       }
}

当我将按钮添加到_buttonPanel时,它会删除tmpFormButtonPanel中的按钮。从我所听到或读过的内容来看,WebControl只能分配给一个面板。所以这可以解释为什么它不起作用。

所以我把代码改为了。

var tmpFormButtonList = new List<ButtonBaseUc>();
 if (!_formButtonDict.TryGetValue(new Guid(_hiddenField.Value), out tmpFormButtonList))
{
       tmpFormButtonList = new List<ButtonBaseUc>();
       _formButtonDict.Add(new Guid(_hiddenField.Value), tmpFormButtonList);
}
foreach (var tmpButton in tmpFormButtonPanel.Controls)
{
       if (tmpButton is ButtonBaseUc)
       {
            tmpFormButtonList.Add((ButtonBaseUc)tmpButton);
       }
}

最后一部分做同样的事情,但在tmpFormButtonList

if (tmpFormButtonList!= null)
{
    var tmpControls = new List<Button>();
    foreach (Button tmpButton in tmpFormButtonList)
    {
         tmpControls.Add(tmpButton);
    }
    tmpControls.Reverse();
    foreach (var tmpButton in tmpControls)
    {
          tmpButton.AddCssClass("xy");
          _buttonPanel.Controls.Add(tmpButton);
     }
  }

这很有效。但为什么?我只是将按钮分配给另一个列表,然后再将其添加到新面板。参考文献仍然相同。我错过了什么?

1 个答案:

答案 0 :(得分:2)

控件只能属于一个父控件。由于您已将其分配到字典值中的Panel,因此如果将其移至_buttonPanel,则会将其删除。

这不是documented,但您可以在source中看到它:

// ...
if (control._parent != null) {
   control._parent.Controls.Remove(control);
}

您已通过不使用Panel作为&#34;存储&#34;来解决此问题。但是List<ButtonBaseUc>。此列表不是控件(因此控件没有父级),因此如果将其分配给另一个(父级)控件,则不能删除它。