Вызов функции, расположенной в родительском пользовательском элементе управления, из дочернего пользовательского элемента управления в winform - PullRequest
1 голос
/ 23 сентября 2019

Это моя родительская форма:

 public partial class ParentControl: UserControl
 {

    public ParentControl()
    {
        InitializeComponent();   
    }

     private void button1_Click(object sender, EventArgs e)
    {
        ChildForm child= new ChildForm ();
        child.Dock = DockStyle.Fill;
        TabPage tabNewChild= new TabPage("Child");
        tabNewChild.Controls.Add(child);

        tabDetails.TabPages.Add(tabNewChild);
        tabDetails.SelectedIndex = tabDetails.TabPages.IndexOf(tabNewChild);
    }
     void CloseTab()
     {
          \\Close the selected tab
     }
}

Это мой дочерний usercontrol:

public partial class ChildForm : UserControl
{
    public ChildForm ()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
         \\Call the CloseTab in parent user control.
    }
}

Каков оптимальный и правильный способ реализации этого?

Я исследовал делегаты и события, но не могу решить, что использовать.

У меня есть много модулей, которые будут реализованы таким образом, поэтому я хочу знать, как это сделать правильно.,Большое спасибо.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вы можете получить доступ к свойству Parent для ChildForm, затем привести его к ParentControl и вызвать метод CloseTab:

public partial class ChildForm : UserControl
{
  private void button1_Click(object sender, EventArgs e)
  {
    (Parent as ParentControl)?.CloseTab(this);
  }
}

Вы можете добавить экземпляр вкладки в качестве аргумента метода, чтобы закрыть вкладку Good.

public partial class ParentControl: UserControl
{
  public void CloseTab(ChildForm sender)
  {
    // close sender
  }
}
1 голос
/ 23 сентября 2019

Хорошим решением является создание на вашем пользовательском элементе управления события, которое запускается при запросе закрытия:

public partial class ChildForm : UserControl
{
    public ChildForm ()
    {
        InitializeComponent();
    }

    public event EventHandler CloseTabRequested;

    protected virtual void OnCloseTabRequested(EventArgs e)
    {
         CloseTabRequested?.Invoke(this, EventArgs.Empty);
    }

    private void button1_Click(object sender, EventArgs e)
    {
         OnCloseTabRequested(EventArgs.Empty);
    }
}

Вы можете обработать событие в родительской форме:

 public partial class ParentControl: UserControl
 {

    public ParentControl()
    {
        InitializeComponent();   
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ChildForm child= new ChildForm ();
        child.Dock = DockStyle.Fill;
        child.CloseTabRequested += ChildForm_CloseTabRequested;
        TabPage tabNewChild= new TabPage("Child");
        tabNewChild.Controls.Add(child);

        tabDetails.TabPages.Add(tabNewChild);
        tabDetails.SelectedIndex = tabDetails.TabPages.IndexOf(tabNewChild);
    }

    void ChildForm_CloseTabRequested(object sender, EventArgs e)
    {
        CloseTab((ChildForm)sender);
    }

    void CloseTab(ChildForm requestingForm)
    {
        \\Close the selected tab
    }
}

С этим решением пользовательский элемент управления не привязан к конкретной родительской форме для максимального повторного использования.Это также позволяет избежать зависимости дочерней формы от родительской формы, что является хорошим дизайном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...