0

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

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

在 form1 上,我将 SampleArrayList 与本地数组列表相关联。

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

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

form2 = new Form1(this, SampleArrayList);

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

4

4 回答 4

1

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

于 2012-04-19T16:04:56.570 回答
1

在上面的评论中引用 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, 而不是我在本示例中所做的字符串。AnArrayList是可变引用类型,而是 string不可变的。这意味着您可以只修改 ArrayList传递给 Form2 的值,这些更改将反映在 Form1 中的变量中,因为它们都指向同一个底层 ArrayList. 我把这段代码留在这里,因为它涵盖了一般情况。
  • 您说单击提交按钮时隐藏了 Form2。通常在这个设计中你会关闭它,因为它不再需要了。如果你真的不打算再次使用它,我建议关闭它。如果您真的打算再次显示该表格,那么只需隐藏它就可以了。
  • 如果您在提交时关闭 Form2,它将触发 FormClosing 事件,如果您只是隐藏它,它将触发 Visible 事件。您可能应该在我的代码中删除这两个事件处理程序之一,具体取决于您是实际关闭它还是隐藏它。如果你有时做一个,有时做另一个,那么可以随意离开两者。如果您将两者都留在其中,即使您只使用一个,您实际上也不会伤害任何东西(除了使人感到困惑)。
于 2012-04-19T17:02:45.077 回答
0

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

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

当您想ArrayList简单地更新写入时:

 Form1.SampleArrayList = SampleArrayList;

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

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

编辑:

如果form1form2都是同一个类的一个实例,你只需要制作ArrayList静态的。

于 2012-04-19T16:27:07.620 回答
0

我将向 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 或更高版本,我建议您使用通用 List 而不是 ArrayList 来存储列表数据。

于 2012-04-19T16:04:34.967 回答