2016-11-25 3 views
2

C'est probablement une question très basique sur le comportement de C# et WebControl. J'ai eu ce travail, mais ce serait bien si quelqu'un pouvait clarifier où la différence réside.Le contrôle est supprimé de l'ancien contrôle parent mais pas si j'utilise une liste <Control>, pourquoi?

Avant

J'ai un dictionnaire avec une clé donnée (Guid) et un Panel. Ce panneau contient un WebControl. Maintenant, je voudrais attribuer ce bouton à un autre panneau.

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

Le moment ajouter le bouton à _buttonPanel, il supprime le bouton de tmpFormButtonPanel. D'après ce que j'ai entendu ou lu, un WebControl ne peut être affecté qu'à un seul panneau. Donc, cela expliquerait pourquoi cela ne fonctionne pas.

J'ai donc changé le code pour ceci.

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

La dernière partie fait la même chose, mais sur le 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); 
    } 
    } 

Cela fonctionne. Mais pourquoi? J'affecte seulement le bouton à une autre liste avant de l'ajouter au nouveau panneau. Les références sont toujours les mêmes. Qu'est-ce que je rate?

+1

Je ne sais pas pourquoi cela fonctionne dans la deuxième approche. Quoi qu'il en soit, pourquoi avez-vous besoin de déplacer ce bouton webcontrol de panel1 à panel2 sans le retirer du premier panneau? Est-ce la raison pour laquelle vous en avez toujours besoin dans le panneau 'tmpFormButtonList' du dictionnaire? Ensuite, n'utilisez pas un 'Control' comme conteneur mais un' List 'comme' Value' pour le dictionnaire. –

+0

@TimSchmelter Ah, c'est la différence. Dans la deuxième approche, j'utilise une liste au lieu d'un panneau! C'est ce qui me manquait. Merci! – greenhoorn

Répondre

2

Un contrôle ne peut appartenir qu'à un seul contrôle parent. Puisque vous l'avez affecté au Panel dans la valeur du dictionnaire, il sera supprimé si vous le déplacez vers le _buttonPanel.

Ce n'est pas documented mais vous pouvez le voir dans le source:

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

Vous avez résolu ce par ne pas utiliser un Panel comme « stockage », mais un List<ButtonBaseUc>. Cette liste n'est pas un contrôle (donc le contrôle n'a pas de parent), donc il ne doit pas être supprimé si vous l'attribuez à un autre contrôle (parent-).