是否可以将三个表单链接在一起?

时间:2018-10-15 13:17:21

标签: c# forms winforms

到目前为止,我只能将2个表单链接在一起。
我需要将3个表单链接在一起的原因是因为我有InventoryFormMainForm,它们可以打开或显示我的SupplierFormsupplierform.show();)。
< / p>

我需要在InventoryForm.dataGridView1中进行一些处理后,才能刷新SupplierForm上的数据。
问题是当我在SupplierForm上设置参数来保存/获取InventoryForm时,如下所示:

public SupplierForm(InventoryForm inventory)
{
    InitializeComponent();

    inventoryform = inventory;
}

并在InventoryForm上使用如下方法:

//this is on `SupplierForm`
private void backbutton1_Click(object sender, EventArgs e)
{
    //closes module and .Focus() back to inventory form
    connection.Close();
    inventoryform.RefreshGrid();
    inventoryform.dataGridView1.Sort(inventoryform.dataGridView1.Columns["ItemID"], ListSortDirection.Ascending);
    this.Close();
}

每当我尝试在{{1}中使用MainForm来打开或显示(SupplierForm supplierform.show();时,SupplierForm都会要求一个button1的参数}}。

我什至尝试连接MainFormMainForm,但是问题变得越来越大,所有链接到SupplierForm的Forms都在请求mainform参数。

您碰巧知道解决方法吗?

3 个答案:

答案 0 :(得分:0)

有一些解决方案,但是最简单的方法是创建一个接口:

public interface IRefreshable()
{
    void RefreshGrid();
}

并以您的形式实现它:

public SupplierForm : IRefreshable
{
    public void RefreshGrid()
    {
         // Your form-specific refresh code goes here
         this.SupplierGrid.Refresh();
    }
}

public MainForm : IRefreshable
{
    public void RefreshGrid()
    {
         // Your other form-specific refresh code goes here
         this.MainGrid.Refresh();
    }
}

实现接口是对对象将拥有该方法的承诺,而无需了解对象的其他信息。现在,可以使用MainForm或InventoryForm参数来提供供应商表单。不在乎,因为它们都有自己的RefreshGrid版本。

public SupplierForm
{
    private IRefreshable parentform;

    public SupplierForm(IRefreshable parent)
    {
        InitializeComponent();
        parentform = parent;
    }

//this is on `SupplierForm`
private void backbutton1_Click(object sender, EventArgs e)
{
    //closes module and .Focus() back to inventory form
    connection.Close();
    parentform.RefreshGrid();
    this.Close();
    }
} 

答案 1 :(得分:0)

如果您知道每种形式只有一个实例,则可以使用静态帮助器类 例如:

public static class formHelper
{
    static InventoryForm InvForm;
    static SuplierForm SupForm;
    static MainForm MnForm;
}

您可以使用formHelper.InventoryForm在命名空间中的任何位置访问变量。但是在此之前,您需要设置变量以包含正确的形式:

public MainForm() //the constructor
{
    formHelper.MnForm = this;
}

在每种形式的构造函数中执行此操作会更改课程名称。

在每种形式上调用的方法仍然需要在每种形式上创建,但是对引用进行隐藏很容易且可访问。希望对您有所帮助。

答案 2 :(得分:0)

您可以使用多个这样的构造函数:

    public SupplierForm()
    {
        InitializeComponent();

    }
   public SupplierForm(InventoryForm inventory) :this()
   {
     InitializeComponent();

     inventoryform = inventory;
   }