这可能是关于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);
}
}
这很有效。但为什么?我只是将按钮分配给另一个列表,然后再将其添加到新面板。参考文献仍然相同。我错过了什么?
答案 0 :(得分:2)
控件只能属于一个父控件。由于您已将其分配到字典值中的Panel
,因此如果将其移至_buttonPanel
,则会将其删除。
这不是documented,但您可以在source中看到它:
// ...
if (control._parent != null) {
control._parent.Controls.Remove(control);
}
您已通过不使用Panel
作为&#34;存储&#34;来解决此问题。但是List<ButtonBaseUc>
。此列表不是控件(因此控件没有父级),因此如果将其分配给另一个(父级)控件,则不能删除它。