如果从子窗体调用方法,如何设置值

本文关键字:何设置 设置 窗体 调用 方法 如果 | 更新日期: 2023-09-27 18:22:47

我的应用程序目前有两个表单。它创建了一个子表单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
    }
}

然而,当我设置一个按钮来使用rglurdate运行更多的代码时,我会得到空指针错误:

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

如果从子窗体调用方法,如何设置值

问题在形式2中,你不能写'Form1frm=newForm1();'这个代码。

在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();
        }
    }
}

纯粹从防御编码风格的角度来看,我认为在调用rglu上的方法之前测试它是否为null是一种很好的做法。

例如

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(),为什么它需要是公共的。

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

您在其他任何地方都不使用frm变量,也不显示表单,所以在这种情况下,垃圾收集器是唯一一个将在rdaterglu变量中接收数据的人。

你似乎想对已经存在的表单进行操作。在这种情况下,你必须将对现有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();
    // ...
}

要从Form1显示Form2,请使用

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