【问题标题】:When closing a tabpage on a Tabcontrol, call form.close在 Tabcontrol 上关闭标签页时,调用 form.close
【发布时间】:2019-10-03 06:21:06
【问题描述】:

在我的应用程序中,我尝试在标签页中使用表单。这些表格都是数据管理表格。 我编辑了tabcontrol(创建了一个自定义tabcontrol),所以我可以通过双击tabheader来删除tabpages。

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

在此函数设置断点时,它永远不会进入。
现在我的问题是:是否可以从 Tabcontrol 调用表单的 Close 方法。最好像下面这样。

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

【问题讨论】:

    标签: c# custom-controls tabcontrol visual-studio-2019


    【解决方案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);
    }
    

    【讨论】:

    • 我正在尝试在我的自定义选项卡控件中实现它,但它还没有任何区别。是否只能从实际的表单中放置选项卡控件?
    • 演示使用默认的TabControl
    • 谢谢,我想我明白了,问题可能在于所选选项卡的文本/名称与表单的文本/名称不同。所以我的实现方法应该是让我可以替换几个字符(替换前缀)。我会告诉你我的计划是否有效。
    • 谢谢。虽然我不得不做一些改变。我的意图现在有效。我会将您的答案标记为已接受的答案,因为它是我需要的基础。
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    相关资源
    最近更新 更多