2017-09-03 2 views
-1

처음에는 내 프로그램 (form1)에 빈 공용 문자열 배열을 선언하고 단추를 클릭하면 DataGridview 셀의 문자열을 배열에 넣습니다! 하지만 그 배열의 길이를 다른 폼 클래스 (form2)로 가져 오는 데 어려움이 있습니다.한 폼 클래스에서 다른 폼 클래스로 배열 길이 얻기 C#

public partial class Form1 : Form 
{ 
    public string[] strarray; 
    public string order; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void button2_Click(object sender, EventArgs e) 
    { 
     var new1=dataGridView2.Rows[0].Cells[2].Value; 
     ordernew = new1.ToString(); 
     strarray = ordernew.Split(','); 
     Form2 f2 = new Form2();   
     f2.Show(); 
    } 
} 

split 함수를 사용하여 배열에 문자열 값을 할당하는 것은 성공했습니다! form2 코드에서 다음과 같습니다!

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
      InitializeComponent(); 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
      Form1 f1 = new Form1(); 
      for (int m = 0; m < f1.strarray.Length; m++) 
      { 
       label.Text="Hello"; 
      }     
    } 
} 

하지만 내가 Form2를 루프의에서 "개체 참조가 개체의 인스턴스로 설정되지 않습니다"오류를 얻을 프로그램을 실행할 때! 이 문제를 어떻게 해결할 수 있습니까?

+0

에서 그것을 호출 할 때

public partial class Form2 : Form { public string[] strarray { get; set; } //add this. public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { //You can also use foreach to avoid out of bound index foreach(var strItem in strarray) { label.Text = "Hello " + strItem; } } } 

그런 다음 당신은 Form2_Load에서 Form1의 새 인스턴스를 만들 수 있습니다. 이 인스턴스는 Form2를 여는 인스턴스와 다릅니다. 그래서이 예외가 발생합니다. Form1의 현재 인스턴스 또는 배열 자체를 Form2로 보내야합니다. –

답변

0

Form1을 다시 초기화하는 것으로 보입니다.

여러분이 할 수있는 일은 Form2에 다른 속성을 추가 한 다음 Form2을 호출 할 때 값을 할당하는 것입니다. Form2를에서

: 당신이 Form1

public void button2_Click(object sender, EventArgs e) 
{ 
    var new1=dataGridView2.Rows[0].Cells[2].Value; 
    order = new1.ToString(); 

    Form2 f2 = new Form2(); 
    f2.strarry = ordernew.Split(','); //surprise!! I don't know where you get ordernew variable but anyways, assign your values HERE... 
    f2.Show(); 
} 
+0

고강도 작품이 –

+0

귀하의 프로젝트에 행운을 빕니다! –

0
Form1 f1 = new Form1(); 

이것은 문제의 원인입니다. 당신은 이전 창을 사용하지 않는 새 창을 만들므로, 새로운 창은 여전히 ​​strar를 가지지 않습니다. 최소한의 변경만으로이 문제를 해결하는 가장 쉬운 방법은 Form1을 Form1 매개 변수로 가져 와서 필드에 저장하는 것입니다 그걸 써.

public partial class Form2 : Form 
{ 
    private Form1 _form; 
    public Form2(Form1 form) 
    { 
     InitializeComponent(); 
     _form = form; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     for (int m = 0; m < _form.strarray.Length; m++) 
     { 
      label.Text="Hello"; 
     } 

    } 
} 

그리고 Form1의 이벤트 처리기에서 당신은 매개 변수로 this을 전달할 수 있습니다 : 많이가 할 수있는 그 최소한의 변경과 함께 하나의 방법, 나는 그것을 사용 권장하지 않습니다

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

PS 더 큰 스케일에서 혼란스러워진다.

+0

thanx이지만 _form = form; "이름 양식이 현재 컨텍스트에 존재하지 않습니다"라는 오류가 나타납니다! –