2017-10-30 10 views
1

레코드를 보유하고있는 폼이로드 될 때 이동할 템플릿 패널을 만들었습니다. 새 레코드를 추가 할 때 템플릿 패널을 복제 한 다음 각 레코드의 패널 목록에 추가하는 방법이 있습니다. 어떻게 든 컨트롤을 복제 할 때 템플릿 패널에서 컨트롤이 삭제되고 어떻게되는지 알 수 없습니다. 이렇게 코드의 일부는 I가 일어나는 곳 좁힐 3 점에서 messagebox.show()을 넣어한 패널에서 다른 패널로 컨트롤을 복사 할 때 컨트롤이 삭제되는 이유

Panel pn = new Panel() 
     { 
      Width = _PNTemp.Width, 
      Height = _PNTemp.Height, 
      Left = 0, 
      Top = 0, 
      BackColor = _PNTemp.BackColor, 
      ForeColor = _PNTemp.ForeColor, 
      AutoScroll = true, 
      Name = _PNTemp.Name, 
      Tag = _PrgPanels.Count.ToString() 
     }; 

     MessageBox.Show(_PNTemp.Controls.Count.ToString()); 
     foreach (Control c in _PNTemp.Controls) 
     { 
      pn.Controls.Add(c); 
      MessageBox.Show(_PNTemp.Controls.Count.ToString()); 
     } 
     MessageBox.Show(_PNTemp.Controls.Count.ToString()); 
     _PrgPanels.Add(pn); 

아래에 나열된다. 첫 번째는 정확한 수의 컨트롤을 보여주고 두 번째와 세 번째는 컨트롤의 총량의 1/2을 보여줍니다. 왜 이런거야?

+0

컨트롤을 "복사"하지 않습니다. 당신이 그들을 움직이고 있습니다. 냉장고에서 맥주 캔을 뱃속에 복사하면 왜 냉장고에서 사라지나요? 사건이 끝날 때까지 혼동해서는 안됩니다. –

답변

1

각 컨트롤을 하나의 상위 컨트롤에만 추가 할 수 있기 때문입니다. 템플릿 패널의 모든 컨트롤은 이미 템플릿 패널의 자식입니다. 이러한 컨트롤을 새 패널에 추가하려고하면 컨트롤이 템플릿 패널에서 제거됩니다.

컨트롤이 만 한 번에 하나의 Control.ControlCollection에 할당 할 수 있습니다 다음 docs 당으로

. 컨트롤이 이미 다른 컨트롤의 자식 인 경우 다른 컨트롤에 추가되기 전에 해당 컨트롤에서 이 제거되었습니다.

즉, 새 컨트롤을 템플릿에 추가하는 대신 만들어야한다는 의미입니다.

대체 방법은 템플릿 패널을 반환하는 메서드를 만드는 것입니다. 템플릿 패널이 필요하면 메서드를 호출하면 새 패널이 만들어집니다.

public static Panel CreateTemplatePanel() { 
    Panel pn = new Panel(); 
    // set properties, add controls... 
    return pn; 
} 
1

컨트롤은 한 번에 한 패널에만있을 수 있습니다. 무슨 일이 일어 났는지 설명하기 위해 코드에 주석을 추가했습니다.

Panel pn = new Panel() 
    { 
     Width = _PNTemp.Width, 
     Height = _PNTemp.Height, 
     Left = 0, 
     Top = 0, 
     BackColor = _PNTemp.BackColor, 
     ForeColor = _PNTemp.ForeColor, 
     AutoScroll = true, 
     Name = _PNTemp.Name, 
     Tag = _PrgPanels.Count.ToString() 
    }; 

    MessageBox.Show(_PNTemp.Controls.Count.ToString()); 
    //all the controls are still inside _PNTemp 
    foreach (Control c in _PNTemp.Controls) 
    { 
     pn.Controls.Add(c); 
     MessageBox.Show(_PNTemp.Controls.Count.ToString()); 
     //Each time this runs you remove a control from _PNTemp to pn. 
    } 

    //All the controls moved from _PnTemp to pn 
    MessageBox.Show(_PNTemp.Controls.Count.ToString()); 
    _PrgPanels.Add(pn);