2017-02-13 7 views
0

Я пишу программу для доступа к списку массивов формы 1 в форме 2. в следующей программе я могу получить к ней доступ, но в форме 2 список массивов (формы 1), к которому я обращаюсь, показывает пустое. Что может быть причиной этого? Программа Form1 выглядит следующим образом:C#: Ошибка при доступе к arraylist формы1 по form2

public partial class Form1 : Form 
    { 
     public ArrayList hop = new ArrayList(); 

     public Form1() 
     { 
      InitializeComponent(); 
     }  

     private void button1_Click(object sender, EventArgs e) 
     { 
      hop.Add("2016"); 
      hop.Add("2015"); 
      Form2 f = new Form2(); 
      f.checkedListBox2.Text = this.textBox1.Text; 
      f.Show(); 
     } 
    } 

для формы 2 следующим образом:

public partial class Form2 : Form 
    { 
     ArrayList hop2 = new ArrayList(); 
     public Form2() 
     { 
      InitializeComponent();   
     } 
     private void Form2_Load(object sender, EventArgs e) 
     { 
      hop2.Add("2016"); 
      Form1 fp = new Form1(); 
      // fp.hop.Add("kite"); 
      if (hop2[1] == fp.hop[1]) 
       MessageBox.Show("equal"); 
      else 
       MessageBox.Show("not equal"); 
     } 
    } 
+0

Вы инстанцируете новый 'Form1' в вашем' Form2_Load', так что ваш 'ArrayList hop' никогда не заполняется при любых значениях (от' button1_Click') ... – stefankmitph

ответ

-2
ArrayList hop2 = new ArrayList(); 

Должно быть

public ArrayList hop2 = new ArrayList(); 
+0

Вы должны действительно добавить некоторые объяснения относительно того, почему это должно сработать - вы также можете добавлять комментарии в самом коде - в его текущей форме он не дает никаких объяснений, которые могут помочь остальному сообществу понять, что вы сделали, чтобы решить/ответить на вопрос. – ishmaelMakitla

1

Пройди свой Form1 в Form2 конструктора:

public partial class Form1 : Form 
{ 
    public ArrayList hop = new ArrayList(); 

    public Form1() 
    { 
     InitializeComponent(); 
    }  

    private void button1_Click(object sender, EventArgs e) 
    { 
     hop.Add("2016"); 
     hop.Add("2015"); 
     Form2 f = new Form2(this); 
     f.checkedListBox2.Text = this.textBox1.Text; 
     f.Show(); 
    } 
} 

Получить экземпляр вашего Form1 в Form2:

public partial class Form2 : Form 
{ 
    ArrayList hop2 = new ArrayList(); 
    private readonly Form1 m_parentForm; 
    public Form2(Form1 parentForm) 
    { 
     InitializeComponent();   

     m_parentForm = parentForm; 
    } 
    private void Form2_Load(object sender, EventArgs e) 
    { 
     hop2.Add("2016"); 

     if (hop2[1] == m_parentForm.hop[1]) 
      MessageBox.Show("equal"); 
     else 
      MessageBox.Show("not equal"); 
    } 
} 

ПРИМЕЧАНИЕ: Будьте осторожны, не существует нуль-проверка или что-нибудь.

+0

его работа. Не могли бы вы объяснить мне роль/роль 'this' в этом' 'Form2 f = new Form2 (this);' statement. –

+0

@pranjalkhanduri [this] (https://msdn.microsoft.com/en-us/library/dk1507sz.aspx) - это текущий экземпляр вашего класса. В этом конкретном случае ** это ** является ссылкой на 'Form1', вам нужно перейти к' Form2'. – stefankmitph

1

Используйте параметр конструктора, чтобы передать значение form2.

public partial class Form1 : Form 
    { 
     public ArrayList hop = new ArrayList(); 

     public Form1() 
     { 
      InitializeComponent(); 
     }  

     private void button1_Click(object sender, EventArgs e) 
     { 
      hop.Add("2016"); 
      hop.Add("2015"); 
      Form2 f = new Form2(hop); 
      f.checkedListBox2.Text = this.textBox1.Text; 
      f.Show(); 
     } 
    } 

Form2 код

public partial class Form2 : Form 
    { 
     private ArrayList _hopForm1; 
     ArrayList hop2 = new ArrayList(); 
     public Form2(ArrayList hopForm1) 
     { 
      InitializeComponent(); 
      _hopForm1 = hopForm1 
     } 
     private void Form2_Load(object sender, EventArgs e) 
     { 
      hop2.Add("2016"); 
      Form1 fp = new Form1(); 
      // fp.hop.Add("kite"); 
      if (hop2[1] == _hopForm1[1]) 
       MessageBox.Show("equal"); 
      else 
       MessageBox.Show("not equal"); 
     } 
    } 
+0

он тоже сработал .for me. –

+0

Пожалуйста, выберите ответ, наиболее полезный для вас, как принято. –

0

Вы should.t создать новый Form1 на Form2 нагрузки. Используйте Application.OpenForms как:

private void Form2_Load(object sender, EventArgs e) 
{ 
     hop2.Add("2016"); 
     var f1 = (Form1)Application.OpenForms[0];//<--this references Form1 current instance 
     if (hop2[1] == f1.hop[1]) 
      MessageBox.Show("equal"); 
     else 
      MessageBox.Show("not equal"); 
} 
Смежные вопросы