Как установить значение, если метод вызывается из дочерней формы? - PullRequest
0 голосов
/ 06 февраля 2012

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

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

Обратите внимание, что form1 - это всего лишь пара кнопок на данный момент.Один запускается с формы 2 следующим образом:

    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;} метод.Однако до сих пор мне не удавалось использовать эти вещи вообще.Кто-нибудь сталкивался с этой проблемой?

Редактировать: rglu определяется следующим образом:

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

Ответы [ 3 ]

0 голосов
/ 06 февраля 2012
Form1 frm = new Form1();
frm.rglu = glu;
frm.rdate = fulldate;
frm.sort();
Close();

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

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

Обновление:

Это может выглядеть так:

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 голосов
/ 06 февраля 2012

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

в форме Form1 с таким кодом:

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 голосов
/ 06 февраля 2012

Чисто с точки зрения стиля защитного кодирования, я думаю, что было бы неплохо проверить, является ли 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!
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...