在表单之间发送数组列表

本文关键字:数组 列表 表单 之间 | 更新日期: 2023-09-27 18:31:35

目前我正在将一个数组列表从form2发送到表单1,它工作正常。

Form1 form2 = new Form1(this, SampleArrayList); //pass form reference and an arraylist
form2.Show();
this.Hide();

在form1上,我将SampleArrayList与本地Array List相关联。

Form2 formParent;
ArrayList SampleArrayList;
public MainForm(Form2 par, ArrayList _SampleArrayList)
{            
       InitializeComponent();
       this.formParent = par;
       this.SampleArrayList = _SampleArrayList;
}

但是我想避免创建 Form1 的新实例

form2 = new Form1(this, SampleArrayList);

我想将数组列表发送到当前正在运行的 Form1 实例。最好的方法是什么。谢谢

在表单之间发送数组列表

在上面的评论中引用 OP

首先创建 Form1,单击"添加"按钮创建 Form2。点击 提交按钮隐藏 Form2 并创建 Form1 的新实例以及 我不想处理的旧实例。我想点击提交 按钮并返回到正在运行的 Form1 实例。

那真的是一个更大的问题。 这是一个我喜欢的不错的解决方案。

public partial class Form1 : Form
{
    private string dataFromThisForm; //can be whatever
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 otherForm = new Form2();
        //pass some data to other form
        otherForm.SomeData = dataFromThisForm; 
        this.Hide();
        otherForm.Show();
        //when the other form is closed
        otherForm.FormClosed += (sender2, e2) =>
        {
            this.Show();
            string newData = otherForm.NewData;
        };
        //when the other form is hidden.
        otherForm.VisibleChanged += (sender2, e2) =>
        {
            this.Show();
            string newData = otherForm.NewData;
        };
    }
}
public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        //Use SomeData to populate controls.
    }
    public string SomeData { get; set; } //data passed in from other form
    public string NewData { get; private set; }  //data to expose to other form
    private void button1_Click(object sender, EventArgs e)
    {
        NewData = "SomeDataToPassToForm1";
        //this.Close();
        this.Hide();
    }
}

一些注意事项:

  • 你是在传递一个ArrayList,而不是像我那样传递字符串此示例。 ArrayList是可变引用类型,而 string是不可变的。 这意味着您只需修改 ArrayList传递给 Form2,这些更改将反映在Form1 中的变量,因为它们都指向相同的底层 ArrayList . 我把这段代码留在这里,因为它涵盖了一般情况虽然。
  • 您说您在单击提交按钮时隐藏了 Form2。通常在此设计中,您会关闭它,因为它不需要了。 如果您真的不打算再次使用它,我建议您关闭它。 如果您真的打算再次显示该表格,那么只需隐藏即可没事。
  • 如果在提交时关闭 Form2,它将触发 FormClosing 事件,如果您只需隐藏它,它将触发可见事件。 你可能应该删除我的代码中的这两个事件处理程序之一,具体取决于无论您实际关闭还是隐藏它。如果你有时做一个有时另一个人可以随意离开两者。 你实际上不会伤害任何东西(除了混淆人们),如果你把两者都留在甚至如果您只使用一个。

在应用程序中充当通信平台的静态类可以解决问题,或者两种形式可以由同一对象拥有。

我会向 Form1 添加一个接受数组列表的方法。

像这样:

public void Setup(ArrayList SampleArrayList)
{
    // Do what you need here...
}

然后,您可以从构造函数内部调用此方法(以保持构造函数相同),并在需要更改 Form 正在使用的列表时调用 Setup。

你上面的代码是这样的:

// If you needed a new instance of Form1, it wouldn't change
Form1 form2 = new Form1(this, SampleArrayList); //pass form reference and an arraylist
form2.Show();
this.Hide();
// If you already had an instance in the form2 variable
form2.Setup(SampleArrayList);

无论如何,如果您使用的是 .NET 2.0 或更高版本,我建议您使用通用列表而不是 ArrayList 来存储列表数据。

如果不需要创建静态属性的实例,则可以在 Form1 类中编写静态属性。例如:

private static ArrayList _SampleArrayList;
public static ArrayList SampleArrayList
{
    get { return _SampleArrayList; }
    set { _SampleArrayList = value; }
}

当您想更新ArrayList时,只需写:

 Form1.SampleArrayList = SampleArrayList;

PS:我建议您使用List<>而不是ArrayList

如果您不知道类型而不是ArrayList请使用List<object> else List<T> .

编辑:

如果 form1form2 都是同一个类的 istance,你只需要将ArrayList设为静态。