2011-11-01 4 views
2

다른 클래스의 ProgressBar 속성과 같은 WinForm 컨트롤에 어떻게 액세스합니까?C# 다른 클래스의 WinForm 컨트롤 속성 액세스

아래 코드를 참조하십시오. WinForm 클래스와 그 멤버를 public으로 노출하는 것이 최선의 선택이 아니라는 것을 알고 있지만,이 시점에서 개념을 명확히하려고 노력 중입니다.

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public void button1_Click(object sender, EventArgs e) 
     { 
      Class1 c = new Class1(); 
      c.loop(); 
     } 

     public void PBSetup() 
     { 
      progressBar1.Minimum = 0; 
      progressBar1.Maximum = 100; 
     } 

     public void PBUpdate(int recno) 

     { 
      progressBar1.Value = Class1.recno; 
     } 
    } 
} 

namespace WindowsFormsApplication1 
{ 
    class Class1 
    { 

     public static int recno; 

     public void loop() 
     { 
      //How do I access Form1.PBSetup()?? 

      for (recno = 0; recno <= 100; recno++) 
      { 
       //How do I access Form1.PBUpdate(recno)?? 
      } 
     } 
    } 
} 
+0

이 ... – MPelletier

+0

숫자를 사용하지 마십시오 12 개 이상의 질문의 중복이어야합니다 클래스와 변수 이름에서! – markus

답변

3

비즈니스 로직 (클래스)이 UI (양식)와 상호 작용하는 것을 원하지는 않습니다. 비즈니스 로직은 프리젠 테이션 레이어를 가리지 않아야합니다.

양식 클래스 내부에서 일어나는 일들에 응답하려는 경우 양식은 버튼의 클릭 이벤트에 가입 할 많은처럼에 가입 할 수있는 클래스 내부 Event 노출 고려할 수 있습니다. 클래스 인스턴스는 누가 청취하고 있는지를 전혀 모르는 이벤트를 발생시킬 수 있으며, 구독자에게 통지됩니다.

1

큰 시간 코드 냄새처럼 보입니다. :). Class1 안에 Form1의 인스턴스가 있어야 PBUpdate이됩니다. 당신이하고있는 일이 뭔가 잘못 됐다는 것을 알려줍니다.

우리가 도울 수있는 것을 설명하고 도움을 줄 수 있습니다. 그렇지 않으면 당신이 중 하나는 당신이 Form1.PBUpdate()과 같이 호출 할 수있는 정적 기능을 만들거나 Class1

+0

Class1에서 Form1의 진행률 표시 줄을 업데이트하려고합니다. – Shazam

1

당신은 개인의 진행률 표시 줄의 액세스 수식을 변경할 수 있습니다 클래스 내에서 Form1의 인스턴스를 가지고하지 않는 한 PBUpdate에 액세스 할 수있는 방법은 없습니다 내부 또는 공용으로 속성 창에서이 작업을 수행 할 수 있습니다.

Properties pane

는 두 번째 클래스 형식의 인스턴스를 통과해야하고 두 번째 클래스에서 직접 진행 막대의 값을 변경할 수 있습니다 유의하십시오.

그러나 까다로운 솔루션이므로 프레젠테이션 계층 구현을 분리 된 상태로 유지하고 이벤트로 작업해야합니다.

+0

공개로 변경하려고했지만 계속 진행하지 않습니다. progressbar1 속성이 표시되지 않습니다. – Shazam

0

의견 중 하나를 언급 한 것처럼 간단한 방법으로이 방법을 사용하지 않는 것이 좋습니다. 하지만 실제로 폼 컨트롤에 액세스하려면 다음과 같이하십시오.

1) 컨트롤을 선택하고 액세스 한정자를 internal로 설정합니다. 2) 양식 ID를 가정은 "Form1에"이고 제어 ID는 "제어 1"당신의 방법 내부

입니다 :

Form1 form = (Form1)Application.OpenForms["Form1"]; 
// form.control1 should now be available. 
관련 문제