おそらくC#とWebControl
の動作についての非常に基本的な質問です。私はこれを働かせましたが、違いがどこにあるのかを誰かが明確にすることができればうれしいです。コントロールは古い親コントロールから削除されますが、リスト<Control>を使用する場合は表示されません。なぜですか?
前
私は与えられたキー(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は1つのパネルにしか割り当てられません。だから、これがうまくいかない理由を説明します。
私はこれにコードを変更しました。
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);
}
}
これは機能しています。しかし、なぜ?新しいパネルに追加する前に、ボタンを別のリストに割り当てるだけです。参照はまだ同じです。私は何が欠けていますか?
なぜ2番目のアプローチで動作するのかわかりません。とにかく、なぜこのボタンウェブコントロールを最初のパネルから取り除かずに、パネル1からパネル2に移動する必要がありますか?辞書の 'tmpFormButtonList'パネルにまだそれが必要な理由はありますか?次に、コンテナとして 'Control'を使用せず、辞書の' Value'として 'List'を使用してください。 –
@TimSchmelterああ、それは違いです。 2番目の方法では、パネルの代わりにリストを使用します。それが私が欠けていたものです。ありがとう! –
greenhoorn