在表单之间发送数组列表
本文关键字:数组 列表 表单 之间 | 更新日期: 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>
.
编辑:
如果 form1 和 form2 都是同一个类的 istance,你只需要将ArrayList
设为静态。