В моем приложении я пытаюсь использовать формы на вкладках. Все эти формы являются формами управления данными. Я отредактировал 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);
}