2017-03-08 5 views
0

panel1이라는 패널이있는 사용자 콘트롤이 있습니다. 디자이너보기에서 추가했습니다. 이 경우, 콤보 상자에서 옵션을 선택한 후 나는 (mainAspects는 두 개의 문자열을 가지고) UserControl을 두 개의 레이블을 추가 : 사용자가 콤보 상자에서 다른 옵션을 선택할 때, 내가 레이블을 처분하고자하는사용자 콘트롤에 대한 컨트롤을 건너 뛰는 Foreach

private void CreateLabelsForMainAspetcs(List<string> mainAspects) 
    { 
     int mainCount; 
     int firstLabelX; 
     int firstLabelY; 
     int addToFirstLabelY = 0; 

     mainCount = mainAspects.Count; 
     firstLabelX = 22; 
     firstLabelY = 149; 

     for (int i = 0; i < mainCount; i++) 
     { 
       Label mainAsp = new Label(); 
       mainAsp.Text = mainAspects[i]; 
       mainAsp.Location = new Point(firstLabelX, firstLabelY + addToFirstLabelY); 
       mainAsp.AutoSize = true; 
       Controls.Add(mainAsp); 
       addToFirstLabelY = addToFirstLabelY + 100; 
     } 
    } 

, 후 이 코드는 다음과 같습니다.

foreach (Control ctrl in this.Controls) 
      { 
       if (ctrl is Label) 
        ctrl.Dispose(); 
      } 

으로 새 코드를 만듭니다. 그러나 foreach 루프는 panel1과 첫 번째 레이블 (두 번째 레이블을 건너 뛴 후)을 통해서만지나갑니다.

foreach 루프 앞에 usercontrol이 this.Controls.Count.ToString() 인 컨트롤이 몇 개 있는지 확인했습니다. uc에는 3 개의 컨트롤이 있습니다 (GetType() 함수로 하나의 패널과 두 개의 레이블을 발견하여 모든 컨트롤을 찾습니다).

따라서 CreateLabelsForMainAspetcs(List<string> mainAspects)의 두 번째 실행 후 3 개가 아니지만 4 개의 컨트롤이 있습니다. 1 개의 패널 및 3 개의 레이블이 있습니다.

후에 하나의 lable 만 표시하려면 목록에서 한 문자열을 사용하여 처분 코드와 createlabel을 실행하십시오. usercontrol에는 하나의 레이블 만 있고 두 번째 레이블은 사라집니다. 그러나 Controls.Count에는 4 개의 컨트롤 (1 개의 패널과 3 개의 라벨)이 있다고합니다. 내가 뭘 잘못했는지 도울 수있어?

+0

처 음 호출에 아무 것도하지 않는다고 가정하는 것이 잘못 되었습니까? 컨트롤에 여전히 처분 할 레이블에 대한 참조가 있기 때문에? 어쩌면 컨트롤에서 레이블을 제거한 다음 폐기하십시오. – Sebastien

답변

0

Controls 컬렉션을 사용하여 반복을 반복하는 동안 해당 레이블을 삭제하는 것으로 추측합니다. 그 때문에 처음 폐기 된 레이블에서 반복 반복이 중지됩니다.

처분하는 대신 List<Label>에 추가하려고합니다. 모든 레이블 컨트롤이 목록에 추가되면 해당 목록을 반복하여 제거하십시오.

그래서, 대신

foreach (Control ctrl in this.Controls) 
{ 
    if (ctrl is Label) 
     ctrl.Dispose(); 
} 

List<Label> labelList = this.Controls.OfType<Label>().ToList(); 
foreach(Label lbl in labelList) 
{ 
    lbl.Dispose(); 
} 
+0

대단히 감사합니다 :) – donmichael

0

옵션 하나를 시도해보십시오 : 당신이 당신의 컨트롤에서 목록 상자를 사용할 수 있습니다 : 예 다음 UC에서리스트 박스를 사용하고있는 목록을 유지하는 경우 부모로 설정하고 UC ListBox.source를 목록으로 설정합니다.

옵션 2 기본보기 (Usercontrol.Clear()) 프로 시저를 만들려면 코드를 실행하여 새 레이블을 추가하는 것보다 먼저 호출하십시오. 이 호출은 사용자에게 눈이 멀거나 일반 호출을 강제 할 수 있습니다.