Roberto
Roberto

Reputation: 39

When closing a tabpage on a Tabcontrol, call form.close

Within my application i am trying to use forms in tabpages. These forms are all data managing forms. I edited the tabcontrol (created a custom tabcontrol) so i can remove tabpages by double clicking on the tabheader.

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

Although it works. Its actually not doing what I need. Because any changes on the form in the tabpage, are lost, regardless of the below

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

When setting a breakpoint at this function, it never enters.
Now my question: Is it possible to call the Close method of the form from Tabcontrol. Preferably something like below.

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

The main problem I am facing is I don't know how to access a function on a form from only knowing the selected tab. And I cant find it either.


Solution after using KyleWangs answer as base: Custom Control:

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

Form:

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

Upvotes: 0

Views: 751

Answers (1)

大陸北方網友
大陸北方網友

Reputation: 3767

You can use property Application.OpenForms to get the open form instance.

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

Upvotes: 2

Related Questions