При закрытии вкладки в Tabcontrol вызовите form.close

В своем приложении я пытаюсь использовать формы на вкладках. Все эти формы являются формами управления данными. Я отредактировал элемент управления вкладками (создал настраиваемый элемент управления вкладками), чтобы можно было удалять страницы вкладок, дважды щелкнув заголовок вкладки.

protected override void OnMouseDoubleClick(MouseEventArgs e)
{
  base.OnMouseDoubleClick(e);
  //* Default method of closing a tab.
  if (Selectedtab != null)
    TabPages.Remove(Selectedtab);
}

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

public partial class SomeForm : Form
{
  private void SomeForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (HasChanges() && CustomMessage.WarningBox("There is unsaved data. Are you sure you want to close"))
            return;
        ((TabControl)((TabPage)this.Parent).Parent).TabPages.Remove((TabPage)this.Parent);
    }
}

При установке точки останова в этой функции она никогда не входит.
Теперь мой вопрос: можно ли вызвать метод Close формы из Tabcontrol. Желательно что-то вроде ниже.

protected override void OnMouseDoubleClick(MouseEventArgs e)
{
  base.OnMouseDoubleClick(e);
  if (Selectedtab != null)
  {
    if (Selectedtab.EmbeddedForm != null)
      TabPages.ASelectedtab.EmbeddedForm.Close();
  }
}

Основная проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как получить доступ к функции в форме, зная только выбранную вкладку. И я тоже не могу его найти.


Решение после использования ответа KyleWangs в качестве основы: Пользовательский элемент управления:

protected override void OnMouseDoubleClick(MouseEventArgs e)
{
  base.OnMouseDoubleClick(e);
  string frmSearchName = "Frm" + SelectedTab.Name.Substring(3);
  Form f = (Form)Application.OpenForms[frmSearchName];
  if (f != null)
    f.Close();
  else
    TabPages.Remove(SelectedTab);
}

Форма:

private void SomeForm_FormClosing(object sender, FormClosingEventArgs e)
{
  SetChanges();
  if (HasChanges() && !CustomMessage.WarningBox("There is unsaved data. Are you sure you want to close?"))
    e.Cancel = true;
  else
    ((TabControl)((TabPage)this.Parent).Parent).TabPages.Remove((TabPage)this.Parent);
}    

person Roberto    schedule 03.10.2019    source источник


Ответы (1)


Вы можете использовать свойство Application.OpenForms, чтобы получить экземпляр открытой формы.

private void Form1_Load(object sender, EventArgs e)
{
    tabControl1.TabPages.Clear();
    PageForm1 f1 = new PageForm1();
    AddNewTab(f1);
}

private void AddNewTab(Form frm)
{
    TabPage tab = new TabPage(frm.Text);
    frm.TopLevel = false;
    frm.Parent = tab;
    frm.Visible = true;
    tabControl1.TabPages.Add(tab);
    frm.Location = new Point((tab.Width - frm.Width) / 2, (tab.Height - frm.Height) / 2);
    tabControl1.SelectedTab = tab;
}

private void tabControl1_DoubleClick(object sender, EventArgs e)
{
    Form f = (Form)Application.OpenForms[tabControl1.SelectedTab.Text];
    f.Close();
    tabControl1.TabPages.RemoveAt(tabControl1.SelectedIndex);
}
person Kyle Wang - MSFT    schedule 04.10.2019
comment
Я пытаюсь реализовать его в своем настраиваемом элементе управления вкладками, но пока это не имеет никакого значения. Возможно ли это только из фактической формы, в которой находится элемент управления табуляцией? - person Roberto; 04.10.2019
comment
В демонстрации используется TabControl по умолчанию. - person Kyle Wang - MSFT; 04.10.2019
comment
Спасибо, я думаю, что у меня возникла идея, и проблема может заключаться в том, что текст / имя выбранной вкладки не совпадает с текстом / именем формы. Так что мой метод реализации должен быть таким, чтобы я мог заменить несколько символов (заменить префикс). Я дам вам знать, сработает ли то, что я запланировал. - person Roberto; 04.10.2019
comment
Спасибо. Хотя мне пришлось внести несколько изменений. То, что я задумал, работает сейчас. Я отмечу ваш как принятый ответ, потому что это то, что мне нужно в качестве основы. - person Roberto; 04.10.2019