2017-02-19 8 views
0

한 클래스의 여러 개체를 만들고 한 폼에서 편집 한 다음 여러 폼에서 해당 개체를 사용하려고합니다. 다행히도 아래의 코드가 문제를 강조 표시하려고합니다. C# 여러 폼에 사용할 클래스의 전역 개체 만들기

나는 같은 클래스 ... 나는 톰과 댄 만든 Form1에

public class Player 
{ 
     public string name; 
     public int goals;   
} 

을 생성하고 누르면 자신의 목표 수를 증가 버튼을 추가했습니다.

public partial class Form1 : Form 
{ 

    Player tom = new Player() 
    { 
     name = "Tom", 
     goals = 5 
    }; 

    Player dan = new Player() 
    { 
     name = "Dan", 
     goals = 7 
    }; 

    public void UpdateForm() 
    { 
     label1.Text = tom.name; 
     label2.Text = dan.name; 
    } 


    public Form1() 
    { 
     InitializeComponent(); 
     UpdateForm(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     tom.goals += 1; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     dan.goals += 1; 
    } 
} 

그런 다음 form2에 이름과 새 목표 수를 표시하려고합니다. 내가 가진 문제는 그 객체가 그 맥락에서 존재하지 않는다는 것입니다.

{ 
public partial class Form2 : Form 
{ 
     public void UpdateForm2() 
    { 
     label1.Text = tom.name; 
     label2.Text = tom.goals; 
     label3.Text = dan.name; 
     label4.Text = dan.goals; 
    } 


    public Form2() 
    { 
     InitializeComponent(); 
     UpdateForm2(); 
    } 
} 
} 

이러한 개체를 전역으로 만들고 양식간에 편집하려면 어떻게해야합니까? 나는 대답을 찾으려고 노력했지만이 사용 사례와 아주 일치하는 것을 찾지 못했습니다. 어떤 도움이나 조언을 부탁드립니다.

+0

'Form2'는'Form1'에 의해 표시되고,'Form1' 코드의 어딘가에서'Form2'의 인스턴스를 생성하고 표시합니까? 양식과 어떤 관련이 있습니까? 그들은 둘 다 동시에 전시되고 그들 중 누구도 다른 사람에게 전화를 걸지 않습니까? 아니면 독립적으로 두 가지를 시작하는 제 3의 클래스/양식이 있습니까? – pstrjds

답변

0

List<Person>을 보유한 서비스 클래스가 필요합니다. 그런 다음 두 양식을 동일한 서비스 인스턴스로 공유하십시오. 또는 게으른 옵션은 서비스를 정적 ​​클래스로 만드는 것입니다.

당신은 또한 서비스에 옵저버 패턴을 구현 고려할 수

업데이트.

http://www.dofactory.com/net/observer-design-pattern

+0

정적 클래스로 만들면 다른 폼의 값을 편집 할 수 없다는 의미가 아닙니까? 제안 주셔서 감사합니다, 나는 그것을 줄거야! –

+0

다른 양식으로 편집 할 수없는 이유가 없습니다. –

0

당신은 공간의 개념을 알 필요가있다. 특정 양식의 네임 스페이스에 개체를 만드는 경우 특정 양식을 참조하지 않고 해당 개체를 사용할 수 없습니다.

내가 볼 수있는 한, 객체 player의 인스턴스 두 개를 form 네임 스페이스에 만들었습니다. 하지만 form2 네임 스페이스에는 없습니다. 그러므로 당신은 그 오류를 얻고 있습니다.

당신은 일반적으로 값을 업데이트하는 자식 윈도우의 메소드를 호출하는 등

  • 으로 업데이트하는 데 사용되는 여러 방법을 사용할 수 있습니다.
  • 메디 에이터 사용
  • 값 변경시 이벤트 수신기를 form2에 추가합니다.

개체 인스턴스 또는 정적 개체의 전역 인스턴스를 사용하는 것은 좋지 않습니다.

0

두 번째 폼 생성자에서 플레이어 목록을 전달할 수 있습니다.

0

예, 데이터를 새 양식으로 전송해야합니다. Meybe 매개 변수를 보내면 생성자 매개 변수 또는 양식 2 설정 방법을 사용하십시오.예를 들어

:

 private readonly Player _tom; 
     private readonly Player _dan; 

    public Form2(player tom, player dan) // or use List<Player> parameter 
     { 
      InitializeComponent(); 
      _tom = tom; 
      _dan = dan; 
     } 

또 다른 방법

// Form2.cs

private Player _tom; 
private Player _dan; 

public void SetPalyers(Player tom, Player dan) 
{ 
    _tom = tom; 
_dan = dan; 
} 
1

귀하의 Form1 클래스는 다른 클래스와 같다. 따라서, 당신이 그것에 2 개 속성을 만들 수 있습니다 Form2에서

public partial class Form1 : Form 
{ 
    public Player Tom { get; private set; } 
    public Player Dan { get; private set; } 

    this.Tom = new Player() 
    { 
     name = "Tom", 
     goals = 5 
    }; 

    this.Dan = new Player() 
    { 
     name = "Dan", 
     goals = 7 
    };  

    // The rest of your code 
} 

이 속성 소개 :

public partial class Form2 : Form 
{ 
    public Form1 CallingForm {get; set;} 
    public Form2() 
    { 
     InitializeComponent(); 
     UpdateForm2(); 
    } 
} 

설정을 해당 속성이 같은 두 번째 양식 (첫 번째 형태로이 코드를 넣어)를 표시하기 전에 :

Form2 f2 = new Form2(); 
f2.CallingForm = this; 

그런 다음 두 번째 형태는 다음과 같이 플레이어에 액세스 할 수 있습니다

label1.Text = CallingForm.Tom.name; 

플레이어가 더 많은 경우 대신 List<Player> 속성을 만듭니다. 대신 공공 분야, 사용 속성의 .NET 명명 규칙 다음

일부 다른 음

보십시오. 속성은 데이터 바인딩 및 캡슐화, 유효성 검사 등에 사용될 수 있으며 다른 이점도 있습니다.

public class Player 
{ 
    private int goals; 
    public string Name {get; set;} 
    public int Goals 
    { 
     get { return this.goals; } 
     set 
     { 
      if (value < 0) 
      { 
       throw new ArgumentException("Goals cannot be less than 0."); 
      } 
      this.goals = value; 
     } 
    }  
} 
+0

@ HüseyinBurakKaradag 죄송합니다. 질문을 이해할 수 없습니다. – CodingYoshi

+0

데이터 문제에 액세스하거나 전송할 때 질문하는 질문. 당신의 대답 form1. 전체 양식을 호출하여 데이터 문제를 옮겨서는 안됩니다.나는 전송 작업을위한 전체 형식을 상속하는 올바른 방법이 아닌 것 같아요. –

+0

@ HüseyinBurakKaradag 사용하는 기술입니다. 따라서 사람들은 양식 참조 또는 개별 속성 또는 다른 사용자 정의 유형을 공유할지 여부를 결정할 수 있습니다. – CodingYoshi

0

캡슐화에 대해 생각하십시오. Form2Form1 내에 포함되어 있기 때문에 인스턴스화 된 클래스 개체에 액세스 할 수 없습니다.

다음 쓰기

:

label1.Text = tom.name; 

컴파일러는 객체 Form2.tom를 찾고 있습니다,하지만 존재하지 않습니다.

당신은 어디에과 같이, 볼에 말할 필요 :

label1.Text = Form1.tom.name; 

하면 Form1 접두사를 사용하지 않고 선택한 모든 클래스에 이러한 개체를 사용할 수있게하려면, 선택한 클래스는 Form1의 서브 클래스로 할 것입니다. 그 외의 경우 이전에 설명한 방법으로 다시 참조해야합니다.