2009-09-29 5 views
0

내가 루프이있다 : 당신이 볼 수있는, 내가 이름 "PanelContainer1"를 생성 패널 준 그래서C# 프로그램이 실행되는 동안 생성되는 패널에 도달하는 방법은 무엇입니까?

int iPanelNumber = 1; 

foreach (string[] Persons in alItems) 
{ 
    Panel pPanelContainer = new Panel(); 
    pPanelContainer.Width = contentPanel.Width; 
    pPanelContainer.Height = 50; 
    pPanelContainer.BackColor = Color.FromArgb(
     Convert.ToInt32(aWhiteContentBackgroundColors[0]), 
     Convert.ToInt32(aWhiteContentBackgroundColors[1]), 
     Convert.ToInt32(aWhiteContentBackgroundColors[2])); 

    pPanelContainer.Name = "PanelContainer" + iPanelNumber.ToString(); 
    pPanelContainer.Visible = false; 
    pPanelContainer.Location = new Point(0, 0); 
} 

, "PanelContainer2"등 ...

하지만 내가 어떻게 도달 할 수 이 패널들?

나는 확실히 서면에 의해 그들에 도달 할 수 :

PanelContainer1.visible = true; 

누구나 생각이있어?

+1

BTW : 루프에서 iPanelNumber를 증가시키지 않습니다! 사본입니까/과거인가요? – M4N

답변

2

가장 쉬운 방법은 아마도 사전에

덕분에, 그 목록에있는 모든 패널에 클래스 및 저장 참조에 List<Panel> 필드를 추가하는 예 :

class MyClass 
{ 
    private List<Panel> _panels = new List<Panel>(); 

    void MethodWhichCreatesThePanels() 
    { 
    //.. 
    foreach (string[] Persons in alItems) 
    { 
     Panel pPanelContainer = new Panel(); 
     _panels.Add(pPanelContainer); 
     ... 
    } 
    } 

그런 다음 당신은 사용 후 각 패널에 액세스 할 수 있습니다 색인 :

Panel aPanel = _panels[i]; 
+0

좋아! 나는 그것을 시도 할 것이다. 감사합니다. – Ikky

0

마틴의 대답은 당신이 찾고있는 것과 거의 같지만 .Name 속성에 대해 혼란스러워합니다. 패널 컨트롤의 y가 않습니다.

변수의 이름을 설정하지 않습니다.

는 무엇을 하는가 것은 다음 (MSDN에서 : http://msdn.microsoft.com/en-us/library/system.windows.forms.control.name.aspx)

Name 속성 이름이 아닌 유형과 프로그램 이름으로 객체를 평가하기 위해 런타임에 사용할 수 있습니다. Name 속성은 String 형식을 반환하기 때문에 대/소문자 스타일 논리 문 (Visual Basic의 Select 문, Visual C# 및 Visual C++의 switch 문)에서 평가할 수 있습니다.

0

Panel을 해당 이름의 양식 (또는 로컬 변수)에 필드가 없으므로 그 이름으로 참조 할 수 없습니다. 이러한 필드는 양식 디자이너가 생성하는 Form의 부분 클래스 파일에 정의됩니다. 런타임에 생성되지는 않습니다.

이것은 이름으로 액세스 할 수 없다는 의미는 아닙니다. 코드에서 이름을 변수 이름으로 사용하여 액세스 할 수 없습니다.

가장 확실한 방법은 포함 컨트롤의 Controls 컬렉션을 만든 후 Panel 컬렉션을 추가하는 것입니다. Visible을 false로 설정 했으므로 양식에 눈에 띄는 영향은 없습니다. 코드에서 그래서, 당신은 당신이 다음 이름으로 참조 할 수

contentPanel.Add(p); 

같은 것을 추가 할 것 :

contentPanel.Controls["PanelContainer1"].Visible = true; 

어떤 이유로 당신은 아직 Controls 컬렉션에 추가 할 수없는 경우 (많은 이유가있을 수 있습니다), 다음 방법은 컬렉션 클래스의 인스턴스를 만들고 그 컬렉션에 Panel을 추가하는 것입니다. 이름으로 참조 할 수 있기를 원하므로 가장 확실한 선택은 사전입니다 (예 ::

Dictionary<string, Panel> panels = new Dictionary<string, Panel>; 
... 
panels.Add(p.Name, p); 

그리고 다시, 당신은 그 이름으로 참조 할 수 있습니다 :

panels["PanelContainer1"].Visible = true; 

을 ...이 경우, Panel가 실제로 표시 될 수없는 것이지만, 그것은 Controls 컬렉션 아니기 때문에 표시 컨테이너 컨트롤의.

그냥 그렇다 : 그렇게하는 것이 힘이면 변수 이름에 접두어를 사용하지 말아야한다. 여전히이 컨벤션을 사용하는 상점이 있지만 일반적으로 C# 프로그래머 커뮤니티에 의해 포기되었습니다.

+0

아, 좋은 답변 주셔서 감사합니다. variablename 앞에 "_"를 사용하는 것이 더 일반적입니까? – Ikky

+0

IDE는 일반적으로 변수의 유형을 알려줄 수 있기 때문에 일반적으로 이름에 유형을 포함시키는 것은 유용하지 않습니다. 이것은 매우 큰 주제의 작은 조각입니다 (예 : http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx). –

관련 문제