Можно ли связать три формы вместе? - PullRequest
0 голосов
/ 15 октября 2018

Пока что я могу связать только 2 формы вместе.
Причина, по которой мне нужно связать 3 формы вместе, заключается в том, что у меня есть InventoryForm и MainForm, которые могут открывать или отображать мои SupplierForm (supplierform.show();).

Мне нужно обновить данные на моем 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();
}

MainFormзапрашивает параметр для SupplierForm всякий раз, когда я пытаюсь открыть или показать (supplierform.show();) SupplierForm, используя button1 в моем MainForm.

Я даже пытался соединить MainForm и SupplierForm но проблема становится больше, все формы, связанные с MainForm, теперь запрашивают параметр mainform.

Вам не известно исправление для этого?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Если вы знаете, что будет только один экземпляр каждой формы, вы можете использовать статический вспомогательный класс, например:

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

Вы можете получить доступ к переменным из любого места в пространстве имен, используя formHelper.InventoryForm.Но перед этим вам нужно установить переменные, содержащие правильную форму:

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

Сделайте это в конструкторе каждой формы, измените имена курса.

Методы, которые вы вызываете сразличные формы все еще должны быть созданы на каждой, но запоминать ссылки намного проще и доступнее.Надеюсь, это вам как-то поможет.

0 голосов
/ 15 октября 2018

Вы можете использовать несколько конструкторов, таких как:

    public SupplierForm()
    {
        InitializeComponent();

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

     inventoryform = inventory;
   }
0 голосов
/ 15 октября 2018

Для этого есть несколько решений, но самое простое - создать интерфейс:

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();
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...