2012-02-06 3 views
0

Мое приложение в настоящее время имеет 2 формы. Она создает форму к югу, Form2, которая заканчивается следующим кодом:Как установить значение, если метод вызывается из дочерней формы?

public partial class Form2 : Form 
{ ... 
    Form1 frm = new Form1(); 
     frm.rglu = glu; 
     frm.rdate = fulldate; 
     frm.sort(); 
    Close(); 
} 

Обратите внимание, что форма Form1 всего пару кнопок на данный момент. Один начинается Form2 следующим образом:

private void button2_Click(object sender, EventArgs e) 
    { 
     using (Form2 AcqForm = new Form2()) 
     { 
      AcqForm.ShowDialog(this); 
     } 
    } 

Ни один другой код не работает, за исключением кнопки test(); показанного ниже). Это frm.sort(); работает следующий код найден в Form1:

public partial class Form1 : Form 
{ 
    public void sort() 
    {   
     datelist = new List<DateTime>(rdate); 
     datelist.Sort((a, b) => a.CompareTo(b)); 

     var result = rdate 
     .Select((d, i) => new { Date = d, Int = rglu[i] }) 
     .OrderBy(o => o.Date) 
     .ToArray(); 

     this.rdate = result.Select(o => o.Date).ToArray(); 
     this.rglu = result.Select(o => o.Int).ToArray(); //all works fine 

     for (int i = 7; i+7 <= rglu.Length; i++) 
     { 
    Console.WriteLine(Convert.ToString(rdate[i]) + Convert.ToString(rglu[i])); 
     } //This shows values as expected 
    } 
} 

Однако, когда я установил кнопку запуска еще немного кода с помощью rglu и rdate я получаю пустые ошибки указателя:

public partial class Form1 : Form 
{ 
    private void test(object sender, EventArgs e) 
    { 
     for (int i = 7; i < rglu.Length; i++){} //rglu is null! The values are lost. 
    } 
} 

Я считаю, для решения требуется метод int[] rglu {get; set;}. Однако до сих пор я был неудачным в использовании этих вещей вообще. Кто-нибудь столкнулся с этой проблемой?

Edit: rglu определяется следующим образом:

public int[] rglu { get; set; } //I don't get how this works though 
+0

Является 'Sort()' выполняется перед вызовом 'тест()'? – CJBrew

+0

Да, это называется заранее. –

+0

Когда вы вызываете 'Close()' в своем исходном фрагменте, я полагаю, вы только что закрыли Form2? Вы запустили Form1 в некотором коде, который вы не предоставили? Является ли метод 'test()' для Form1 или Form2? – CJBrew

ответ

0

Проблема в form2, Вы не должны написать 'Form1 frm = new Form1();' этот код.

в Form1 кода WITE так:

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     public int rglu; 
     public DateTime rdate; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnShowForm2_Click(object sender, EventArgs e) 
     { 
      Form2 frm2=new Form2(); 
      frm2.Form1Instance = this; 
      frm2.Show(); 
     } 
     public void sort() 
     { 
      datelist = new List<DateTime>(rdate); 
      datelist.Sort((a, b) => a.CompareTo(b)); 

      var result = rdate 
      .Select((d, i) => new { Date = d, Int = rglu[i] }) 
      .OrderBy(o => o.Date) // Sort by whatever field you want 
      .ToArray(); 

      this.rdate = result.Select(o => o.Date).ToArray(); 
      this.rglu = result.Select(o => o.Int).ToArray(); //all works fine 

      for (int i = 7; i + 7 <= rglu.Length; i++) 
      { 
       Console.WriteLine(Convert.ToString(rdate[i]) + Convert.ToString(rglu[i])); 
      } //This returns values as expected 
     } 
    } 
} 

в Form2 писать коды, как это:

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form2 : Form 
    { 
     public Form1 Form1Instance; 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void btnSortValues_Click(object sender, EventArgs e) 
     { 
      Form1Instance.rglu = glu; 
      Form1Instance.rdate = fulldate; 
      Form1Instance.sort(); 
      Close(); 
     } 
    } 
} 
+0

спасибо !!!! Именно то, что я искал! –

0

Чисто с защитной точки стиля кодирования зрения, я думаю, что это будет хорошая практика, чтобы проверить rglu будучи нуль перед вызовом методов на него.

например.

public void test() 
{ 
    if(rglu == null) 
    { 
     throw new InvalidOperationException("rglu is null!"); 
    } 

    for (int i = 7; i < rglu.Length; i++){} //rglu is not null! 
} 

Я также задал вопрос, почему test() должен быть общедоступным, если он вызван из события нажатия кнопки.

+0

Есть еще больше кода, чем я показал, простите меня, я упрощаю вопрос. test() не обязательно должен быть общедоступным. –

0
Form1 frm = new Form1(); 
frm.rglu = glu; 
frm.rdate = fulldate; 
frm.sort(); 
Close(); 

Вы не можете использовать frm переменную где-нибудь еще и не отображают форму, так что мусор collectior единственный, кто собирается получить эти данные в rdate и rglu переменных в этом случае.

Кажется, что вы хотели работать с уже существующей формой. В этом случае вы должны передать ссылку на существующий Form1 на свой метод в Form2.

Update:

Это может выглядеть следующим образом:

public partial class Form2 : Form 
{ 
    // ... 
    private readonly Form1 _parent; 

    public Form2(Form1 parent) : this() 
    { 
     _parent = parent; 
    } 

    // ... somewhere in a method which closes Form2: 

     Form1 frm = _parent; 
     frm.rglu = glu; 
     frm.rdate = fulldate; 
     frm.sort(); 
     Close(); 

    // ... 
} 

Чтобы показать Form2 из Form1 используйте

using(var form2 = new Form2(this)) 
{ 
    form2.ShowDialog(this); 
} 
+0

Как это сделать? –

+0

добавление параметра типа 'Form1' в конструктор' Form2' будет самым простым способом – max

+0

Можете ли вы показать мне, как это делается? –

Смежные вопросы