2009-08-24 2 views
0

내 응용 프로그램 기본 양식에 "testStr"공용 변수가 있습니다. 나는 사용자 정의 컨트롤로로드 된 탭을 추가하는 tabControl을 가지고있다. 어떻게 이러한 사용자 컨트롤에서 "testStr"을 참조 할 수 있습니까? 나는 그것의 응용 프로그램. * 또는 parentForm. * ... 상상할 것이다. 그러나 ... 나는 노력하고 있지는 않지만, 어떻게해야하는지 잘 모르며 조금 익숙하다. parentApplication.testStr과 같은 것입니다..Net 참조 양식 응용 프로그램 변수

어떤 도움을 주시면 감사하겠습니다 ... 나는 아주 간단하고 간단하다고 확신합니다. 탭 컨트롤이 최상위 폼 내부에 직접 경우

답변

1

무엇 testStr (과 관련이 다른 것) 자신의 클래스와 같은 정보를 저장하고 사용할 필요가 다른 모든 클래스에 대한 참조를 공유 어떻습니까?

따라서 MainForm은이 새 클래스의 인스턴스를 만들고 각 UserControl에 대한 참조를 만들어줍니다. 그렇게하면 UserControls는 MainForm에 대해 알 필요가 없으며 작업하는 데이터에 대해 알게됩니다. 또한 앱의 레이아웃을 변경하면 작업이 더 수월해집니다. 부모님이 항상 위의 한 레벨 또는 최상위 레벨의 부모가 당신이 원하는 양식이 매우 친숙한 것으로 변하지 않는다고 가정하십시오.

0

다음

((this.Parent) as MyForm).testStr 

그렇지 않으면 당신은 계속 복용해야 할 수도 있습니다. Parent 스택의 상단에 도달 할 때까지 양식 유형으로 전송합니다.

또는 일부 정적 변수에 양식 인스턴스에 대한 참조를 절약 할 수

1

((this.FindForm()) as MyForm).testStr 

내가 전에 그 일에 대해 알지 못했던 .... 예를 들어, 당신은 Program.cs을 편집 할 수 있습니다 :

class Program { 
    public static MyForm MainForm { get; private set; } 
    static void Main() { 
     // ... 
     Application.Run(MainForm = new MyForm()); 
     // ... 
    } 
} 

그런 다음 Program.MainForm.testStr으로 testStr을 참조 할 수 있습니다.

0

당신은 값을 얻기 위해 위쪽으로 반복 할 수있다 :

class MyControl : UserControl 
{ 
    public string GetMyStr() 
    { 
     for (Control c = this.Parent; c != null; c = c.Parent) 
     { 
     if (c is MyForm) 
     { 
      return c.testStr; // I recommend using a property instead 
     } 
     } 
     return null; 
    } 
} 

을 또는 값이 모든 인스턴스에서 동일한 경우는, CONST, 또는 정적 읽기 전용 필드로 선언, 또는 정상적인 정적 필드로 :

class MyForm 
    { 
     public static const string TESTSTR = "..."; 
    } 

    class MyControl : UserControl 
    { 
     public void DoSomething() 
     { 
     string s = MyForm.TESTSTR; 
     } 
    }