2017-05-23 3 views
0

저는 C#과 Visual Studio를 사용하고 있습니다. 다른 양식의 변수에 액세스하려고합니다. 나는 다음과 같은 것들을 발견했다.Visual Studio의 다른 폼에서 변수에 액세스하려면 C#

textBox1.Text = form22.textBoxt17.Text; 

그러나 나는 textBox 값에 접근하고 싶지 않다. 단지 변수에 접근하고 싶다. 나는 이것을 시도했다 :

string myVar1 = Form2.myVar2; 

그러나 그것은 작동하지 않는다.

어떤 도움이 필요합니까? 버튼 내부 나중에 코드에서

formLogin (변수의 위치)에서
 private string _firstName = string.Empty; 
     public string firstName 
     { 
      get 
      { 
       return _firstName ; 
      } 
      set 
      { 
       if (_firstName != value) 
        _firstName = value; 
      } 
     } 

, 단지 그런

public partial class formLogin : Form 아래 :

업데이트 이것은 내가 지금 가지고 무엇을 클릭 이벤트 :

  OleDbCommand command2 = new OleDbCommand(); 
      command2.Connection = connection; 
      command2.CommandText = "select firstName from logindb where username = '" + txtUsername.Text + "' and password = '" + txtPassword.Text + "'"; 
      firstName = command2.ExecuteScalar().ToString(); 

나는 이것을 다음과 같은 형식으로 작성합니다. 액세스하고 싶은 곳 formLoad 이벤트에 변수) :

 formLogin fli = new formLogin(); 
     lblName.Text = fli.firstName;    

이 모든 문제는 formAntonyms가 열릴 때, lblName 대신 사용자 이름을 표시의 여전히 비어 있다는 것입니다. 내가 뭘 잘못했는지, 모든 단계를 올바르게 수행했습니다 ...

+0

정확히 무엇이 작동하지 않습니까? 오류 메시지가 있습니까? – Codor

답변

1

올바른 경로에 있으므로 컨트롤이나 변수를 클라이언트 코드에 직접 노출하면 안됩니다.

당신이에서 값을 읽을 수 형태/클래스의 읽기 전용 속성을 만듭니다

//Form2.cs 
public string MyVar{get{ return textBoxt17.Text;}} 

그런 다음 이미로드 Form2를 폼 클래스의 인스턴스 변수를 form22된다.

string myVal = frm22.MyVar; 

편집 : 그런 다음에 대한 참조를 가지고있는 클라이언트 코드에서, 당신은 속성의 값을 읽을 수있는 마지막 코멘트에

좋아 기반을, 당신은 Florm1에 변수가 및 Form2를에서 액세스 할, 원리는 이전 예제와 동일하지만, 대신 컨트롤 속성을 노출시키는 이제 개인 변수를 노출, 대신 Form2의 생활의 지금을 Form1에 살고 :

//Form1.cs 
private string _myVar = string.Empty 

public string MyVar 
{ 
    get 
    { 
     return _myVar ; 
    } 
    set 
    { 
     if(_myVar != value) 
      _myVar = value; 
    } 
} 

적절한 이제는 클라이언트 코드에서 값을 업데이트 할 수 있도록 읽기/쓰기가 가능합니다.

From From2, I assume you have a instance of Form1 named form1: 
string val = form1.MyVar; 
... 
form1.MyVar = "any"; 
+0

@ 스티브, 귀하의 제안에 따라 편집. –

+0

return textBox17.Text 부분까지 모든 것을 얻습니다. 그러나 그것은 내 잘못입니다. 나는 잘 설명하지 못했습니다. 어떤 txtBox 또는 Label이나 Button과도 연관되지 않은 변수에 액세스하려고합니다. 코드에 있지만 Form1.cs에 선언되어 있습니다. Form2.cs에서이 코드에 액세스하려고합니다. –

+0

여기에서 발견 한 코드의 예로 textBox17이있는 첫 번째 코드를 언급했습니다. 누구나 textBox17의 값에 액세스하는 방법을 묻는 중, 선언되고 정의 된 양식에 표시되지 않는 변수에 액세스하려고합니다. @ E-bat –

0

우선 클래스에서 변수에 직접 액세스하는 것은 바람직하지 않은 객체 지향 디자인입니다. 그것은 유지 보수성과 재사용 성을 감소시킵니다.

개체 기능이 분명하지 않기 때문에 문제가 발생합니다.

"이 변수의 값을 원합니다"라는 측면에서 생각하지 말고 "양식 22가 있다고 가정하면 어떤 양식에 어떤 속성이 있어야합니까?"라고 생각하면 안됩니다.

글쎄, 분명히 그것은 크기와 위치가 많고 다른 모양이 많고 양식에 표시되는 정보가 분명히 있으며이 양식의 사용자는 표시된 정보의 텍스트를 알고 싶어한다고 생각합니다.

표시된 정보의 이름이 MyInformation이라고 가정 해 봅시다. 정보에 대한 설명 만 표시 할 수 있다는 점에 유의하십시오. 이 설명 텍스트는 정보 그 자체가 아닙니다.

양식의 적절한 객체 지향 설계는

class Form22 : Form 
{ 
    public string MyInformationText {get {return ...; } 
    ... 
} 

지금 당신이 Form22 일부 MyInformation을 가지고 Form22의 사용자에게 전달되는 것입니다. 또한 귀하는이 정보를 공유하지 않고 정보의 설명 텍스트 만 공유 할 의사가 있음을 전달했습니다. 또한 양식 사용자는이 정보를 변경할 수 없습니다.

이렇게하면 많은 이점이 있습니다. 예를 들어 TextBox에 텍스트를 표시하지 않고 ComboBox에 텍스트를 표시하고 싶다고 가정합니다. 아니면 더 이상 표시하지 않으려 고 할지도 모릅니다. MyInformation의 설명 텍스트를 원했던 양식의 사용자는 변경할 필요가 없습니다.

양식 사용자가 정보를 변경하도록하려면 디자인이 다를 수 있습니다. 아마도 이는 정보의 표시된 설명을 변경해야한다는 것을 의미하기도합니다. 그러나 다시 : 양식 사용자는이 사실을 알 필요가 없습니다. 다시, 이것은 사용자가 변경하지 않고 변경하는 당신에게 자유를 제공합니다 :

public MyInformation SpecialInformation 
{ 
    get {return this.mySpecialInformation;} 
    set 
    { 
     this.mySpecialInformation = value; 
     this.UpdateDisplay(mySpecialInformation); 
    } 
} 

가 계속 표시되는 텍스트 여부에 대한 속성을 제공해야하는 경우 그것은 당신의 모델에 따라 다릅니다 : 세상의 모든 MyInformation 객체가 있으시면 동일한 표시 텍스트 또는 form22에 표시된 텍스트가 form23에 표시된 MyInformation의 텍스트와 다를 수 있습니까? 이것에 대한 대답은 MyInformation이 설명 텍스트를 가져올 함수를 가져야하는지 또는 양식에 설명 텍스트를 가져 오는 함수가 있어야하는지 여부에 영향을줍니다.

다음은 생각해야 할 예입니다. 내 객체는 어떻게해야합니까? 내 개체의 사용자는 내 개체로 무엇을 할 수 있어야합니다. 더 많이 허용할수록 변경할 수있는 사람이 줄어 듭니다. 필요한 것 이상으로 정보를 제공하지 않으면 최대한의 유연성을 누릴 수 있습니다. 게다가 당신은 훨씬 적은 기능을 테스트해야합니다.