C# 填写一份清单<;字符串>;当两个窗体都处于活动状态时,从另一个Winform中删除Winform

C# 填写一份清单<;字符串>;当两个窗体都处于活动状态时,从另一个Winform中删除Winform,c#,forms,winforms,list,setter,C#,Forms,Winforms,List,Setter,当两个表单都打开时,我试图从另一个表单填写列表 在表格WorkOrder中,我有一个列表:list materialsList,然后在我的其他表格AddMaterials中,我有其他list list,这是我想传递给WorkOrder表格的列表,但两个表格都是打开的,我不知道有可能这样做 这是我的表格: 如果我在WorkOrder表单中单击添加材料按钮,则表单AddMaterials将打开。现在,当表单AddMaterials打开时,我用按钮addnewmaterial逐个填充列表中的元素,然

当两个表单都打开时,我试图从另一个表单填写
列表

在表格
WorkOrder
中,我有一个列表:
list materialsList
,然后在我的其他表格
AddMaterials
中,我有其他
list list
,这是我想传递给
WorkOrder
表格的列表,但两个表格都是打开的,我不知道有可能这样做

这是我的表格:

如果我在
WorkOrder
表单中单击添加材料按钮,则表单
AddMaterials
将打开。现在,当表单
AddMaterials
打开时,我用按钮addnewmaterial逐个填充列表中的元素,然后当我单击finish时,我想将
列表列表
传递到
工作订单
列表:
列表材料列表

这是我试图解决的代码:

WorkOrder
表格中:

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

public void setList(List<String> l)
{
    this.materialsList = l;
}
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);
    }
}

评论中的任何问题帖子。

您可以在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表单之前,您可以在此处插入logic以清除该列表,或者如果您有一个工单的多个材质列表,则可以执行其他操作

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;
}
然后从WorkOrder:

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

    private void OnAddMaterialDelegate(string material)
    {
        this.materialsList.Add(material);
    }
这将允许您在将来改变主意,而无需太多返工(例如,如果您想从列表切换到其他类型)

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