【问题标题】:Fill a List<String> of a Winform from other Winform while both forms are active当两个表单都处于活动状态时,从其他 Winform 填充 Winform 的 List<String>
【发布时间】:2016-10-01 16:44:40
【问题描述】:

我正在尝试在两个表单都打开时从另一个表单填写List&lt;String&gt;

WorkOrder 表单中我有一个列表:List&lt;String&gt; materialsList,然后在我的另一个表单AddMaterials 我有另一个List&lt;String&gt; list,这是我想传递给WorkOrder 表单的列表,但是两种形式都是开放的,我不知道是否可以这样做。

这是我的表格:

如果我单击WorkOrder 表单中的“添加材料”按钮,则会打开AddMaterials 表单。现在打开AddMaterials 表单,我使用按钮添加新材料一一填充列表的元素,然后当我单击完成时,我想将List&lt;String&gt; list 传递给WorkOrder 列表:List&lt;String&gt; 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);
    }
}

关于 cmets 的任何问题。

【问题讨论】:

标签: c# forms winforms list setter


【解决方案1】:

您可以在 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 表单以清除列表或执行其他操作(如果您有多个用于 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();
} 

【讨论】:

    【解决方案2】:

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

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

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

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

    然后从 WorkOrder:

        private void button1_Click(object sender, EventArgs e)
        {
            new AddMaterials(OnAddMaterialDelegate).Show();
        }
    
        private void OnAddMaterialDelegate(string material)
        {
            this.materialsList.Add(material);
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      相关资源
      最近更新 更多