При закрытии вкладки в Tabcontrol вызывайте form.close - PullRequest
0 голосов
/ 03 октября 2019

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

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

1 Ответ

1 голос
/ 04 октября 2019

Вы можете использовать свойство 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);
}
...