当两个窗体都处于活动状态时,从其他 Winform 中填充一个 Winform 的列表 <String>

Fill a List<String> of a Winform from other Winform while both forms are active

我正在尝试在两个表单都打开时从另一个表单填写 List<String>

在表格 WorkOrder 中我有一个列表:List<String> materialsList,然后在我的其他表格 AddMaterials 中我有其他 List<String> list,这是我想要的列表传递给 WorkOrder 表格,但两种表格都是开放的,我不知道是否可以这样做。

这是我的表格:

如果我单击 WorkOrder 表单中的添加 Materials 按钮,则会打开表单 AddMaterials。现在打开表单 AddMaterials,我使用添加新 Material 按钮一个接一个地填充列表的元素,然后当我单击完成时,我想将 List<String> list 传递给 WorkOrder 列表:List<String> materialsList.

这是我试图解决这个问题的代码:

WorkOrder形式:

List<String> materialsList = new List<string>();

public void setList(List<String> l)
{
    this.materialsList = l;
}

AddMaterials形式中:

public partial class AddMaterials : Form
{

    List<String> list = new List<string>();

    public AddMaterials()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Adding Materials
        list.Add(material.Text);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        //Passing the list with Method setList()
        WorkOrder o = new WorkOrder();
        o.setList(list);
    }
}

有任何问题post评论。

您可以在 AddMaterials 表单的构造函数中传递对 WorkOrder 表单或 WorkOrder.materialsList 的引用。 所以您的 AddMaterials 代码可以是

public partial class AddMaterials : Form
{
    WorkOrder wo;

    public AddMaterials(WorkOrder wo)
    {
        InitializeComponent();
        this.wo = wo;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Adding Materials
        this.wo.materialsList.Add(material.Text);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.Close();
    }   
}

在 WorkOrder 中,您可以使用此功能打开一个新的 AddMaterials 表单。在创建新的 AddMaterials Form 之前,您可以在此处放置逻辑以清除列表,或者如果您有一个 WorkOrder 的多个材料列表,则执行其他操作。

private void button1_Click(object sender, EventArgs e)
{
    // Add logic here to deal with multiple AddMaterial Forms 
    // on one work order
    new AddMaterials(this).Show();
} 

您正在做的事情不起作用,因为您使用的是两个完全不同的列表。 您可以为 AddMaterials 创建自定义构造函数:

public AddMaterials(List<string> materials)
{
    InitializeComponent();
    this.materials = materials;
}

并将材料声明为 AssMaterials 的成员 class:

private List<string> materials;

如果你想让事情更加分离,你可以传递一个委托:

public delegate void Del(string str);

class AddMaterials
{
    private Del addMaterialDelegate;

    public AddMaterials(Del AddMaterialDelegate) : Form
    {
        InitializeComponent();
        this.addMaterialDelegate = AddMaterialDelegate;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Adding Materials
        addMaterialDelegate(material.Text);
    }
}

然后从工单:

    private void button1_Click(object sender, EventArgs e)
    {
        new AddMaterials(OnAddMaterialDelegate).Show();
    }

    private void OnAddMaterialDelegate(string material)
    {
        this.materialsList.Add(material);
    }

这将允许您在将来改变主意而无需太多返工(例如,如果您想从列表切换到不同的类型)。