2016-11-25 2 views
2

おそらく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); 
    } 
    } 

これは機能しています。しかし、なぜ?新しいパネルに追加する前に、ボタンを別のリストに割り当てるだけです。参照はまだ同じです。私は何が欠けていますか?

+1

なぜ2番目のアプローチで動作するのかわかりません。とにかく、なぜこのボタンウェブコントロールを最初のパネルから取り除かずに、パネル1からパネル2に移動する必要がありますか?辞書の 'tmpFormButtonList'パネルにまだそれが必要な理由はありますか?次に、コンテナとして 'Control'を使用せず、辞書の' Value'として 'List 'を使用してください。 –

+0

@TimSchmelterああ、それは違いです。 2番目の方法では、パネルの代わりにリストを使用します。それが私が欠けていたものです。ありがとう! – greenhoorn

答えて

2

コントロールは、1つの親コントロールにのみ属することができます。あなたは辞書値のPanelにそれを割り当てているので、それを_buttonPanelに移動するとそれがそこで削除されます。

これはdocumentedではありませんが、あなたはsourceでそれを見ることができます。

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

あなたは、「ストレージ」が、List<ButtonBaseUc>としてPanelを使用しないことで、これを修正しました。このリストはコントロールではないため(コントロールには親がありません)、別の(親)コントロールに割り当てると削除されません。

関連する問題