2016-11-25 1 views
2

아마도 C# 및 WebControl의 동작에 대한 아주 기본적인 질문 일 것입니다. 나는이 방법을 사용하고 있지만 차이점이 어디에 있는지 명확히 할 수 있다면 좋을 것이다.List가 <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은 하나의 패널에만 할당 될 수 있습니다. 그래서 이것이 작동하지 않는 이유를 설명 할 것입니다.

그래서이 코드를 변경했습니다.

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

두 번째 접근 방식에서 왜 작동하는지 잘 모르겠습니다. 어쨌든 왜이 버튼 웹 컨트롤을 첫 번째 패널에서 제거하지 않고 panel1에서 panel2로 이동해야합니까? 사전의'tmpFormButtonList' 패널에서 여전히 필요로하는 이유는 무엇입니까? 그런 다음 컨테이너에'Control'을 쓰지 말고'List '를 사전에 대한'Value'로 사용하십시오. –

+0

@TimSchmelter 아아, 그 차이가 있습니다. 두 번째 접근법에서는 패널 대신 목록 을 사용합니다! 그게 내가 놓친거야. 감사! – greenhoorn

답변

2

컨트롤은 하나의 상위 컨트롤에만 속할 수 있습니다. 사전 값의 Panel에 할당 했으므로 _buttonPanel으로 이동하면 해당 값이 사전 값에서 제거됩니다.

documented 아니지만 당신은 source에서 볼 수 있습니다

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

당신은 "저장"하지만 List<ButtonBaseUc>Panel를 사용하지 않음으로써이 문제를 해결했습니다. 이 목록은 컨트롤이 아니므로 (컨트롤에 부모가 없음), 다른 컨트롤 (부모)에 할당하면 제거되지 않아야합니다.

관련 문제