2014-06-16 3 views
1

폼의 내용을 생성하고 레이아웃하는 데 사용하려고하는 for 루프가 있습니다.프로그래밍 방식으로 폼에 컨트롤 삽입

이것은 내가 지금까지 들어 왔 것입니다 :

public void RefreshSkillDialog() 
    { 
     Point nPt = new Point(25, 25); 
     for (int x = 0; x < Enum.GetNames(typeof(Character.Skill)).Length; x++) 
     { 
      GenerateFields(x,nPt); 

      Console.Write(this.Controls.Count + "\n"); 

      Console.WriteLine(this.Controls[x].ToString() + "\n"); 
     } 
    } 

    public void GenerateFields(int it, Point pt) 
    { 
     Label tLbl = new Label(); 

     tLbl.Location = new Point(pt.X + (it * _vSpace), pt.Y); 
     tLbl.Name = Enum.GetName(typeof(Character.Skill), it); 
     tLbl.Text = this.Controls.Count.ToString(); 
     this.Controls.Add(tLbl); 
    } 

_vSpace 생성자에서 10으로 초기화 정수입니다.

이 코드의 결과는 : 나는이 문제를 생각

result of code

가 tLbl 변수를 재사용에 있었다, 그러나 나는 다시 초기화하고있어 이후 지금까지 내가 말할 수있는, 그것은 잘 작동합니다 그것은 모든 반복의 시작 부분에 있습니다.

+0

Enum.GetNames (대해서 typeof (Character.Skill)). 길이'? –

+0

반환 값은 스킬 열거 자의 값 수입니다. 현재 길이는 3으로 반환됩니다. – nukeforum

답변

4

Label을 새로 만들면 기본적으로 100px 너비입니다.

각 새 위치 (x 좌표)가 변경되어 있지만 Label이면 충분하지 않습니다. 각각 새로 만든 Label은 이전 문자와 겹치므로 텍스트를 덮고 있습니다.

LabelAutoSize = true을 설정하여이 문제를 해결할 수 있습니다

Label tLbl = new Label(); 
tLbl.AutoSize = true; 
... 

또는를 크기를 조정하여이 넓은 아니다 않도록 : 또한 단지 때문에, FlowLayoutPanel 사용을 고려할 수

Label tLbl = new Label(); 
tLbl.Size = new Size(10, 23); 
... 

그것은 당신을 위해 레이아웃을 처리합니다. 각각의 새 컨트롤을 추가하고 Location을 설정하는 것을 고민하지 마십시오.

Label tLbl = new Label(); 
tLbl.Name = Enum.GetName(typeof(Character.Skill), it); 
tLbl.Text = flowLayoutPanel1.Controls.Count.ToString(); 
flowLayoutPanel1.Controls.Add(tLbl); 

당신이 그렇게한다면, 당신도 다른 방법에 Console.WriteLine 문을 변경해야합니다 :

`의 결과가 무엇
Console.WriteLine(flowLayoutPanel1.Controls[x].ToString() + "\n"); 
+0

나에게 맡기면이 사소한 것을 간과 할 수있다. 시간을내어 주셔서 감사합니다. 나중에 참조 할 때 라벨이 불투명하기 때문에 이런 일이 발생합니까? – nukeforum

+0

@nukeforum 네. 적어도 WinForms에서. WPF에서는 기본적으로 투명합니다. –

+0

@Grant Winney, 다시 한번 감사드립니다. – nukeforum

관련 문제