如何在 SelectedIndexChanged 事件之前检测 TabControl 中标签页的更改?
Posted
技术标签:
【中文标题】如何在 SelectedIndexChanged 事件之前检测 TabControl 中标签页的更改?【英文标题】:How do I detect a change of tab page in TabControl prior to SelectedIndexChanged event? 【发布时间】:2011-02-24 22:57:32 【问题描述】:我目前通过SelectedIndexChanged
事件确定点击了tabcontrol 的哪个页面。
我想检测 在所选索引实际更改之前,以进行验证。例如,用户单击他们正在查看的标签页以外的标签页。如果未保存表单数据,则会显示一个对话框并询问是否可以继续。如果用户单击“否”,则用户应保留在当前选项卡上。
目前我必须记住上一个标签页,并在回答“否”后切换回它。
我考虑过 MouseDown(以及各种计算逻辑),但我怀疑这是最好的方法。
【问题讨论】:
【参考方案1】:我实际上已经尝试了所有的事件,包括这里的建议,并且没有一个提到的事件发生在正确的时间,以实际陷阱从标签移动。
即使是标签页验证事件在进入标签页而不是离开它时也会触发 - 要么就是我的机器或 .NET 4 发生了一些特殊情况。另一方面,在 .NET 4 中存在 Deselecting 事件为我的目的在正确的时间触发。
private void tab_Deselecting(object sender, TabControlCancelEventArgs e)
【讨论】:
【参考方案2】:在form_load的时候给tabControl添加这样一个事件:
tabControl1.Selecting += new TabControlCancelEventHandler(tabControl1_Selecting);
void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
TabPage current = (sender as TabControl).SelectedTab;
// Validate the current page. To cancel the select, use:
e.Cancel = true;
【讨论】:
正是我正在寻找的事件(显然没有看到)。谢谢。 您在此处拥有的“当前”标签页不是您要验证的标签页(它是新标签页)。必须管理上一个 TabPage,例如在 Selected 事件中。 我实际上不得不自己执行此操作,并且还发现您需要按照 Chris Schmich 的回答使用选项卡验证。 Selected、Selecting(TabIndexChanged 或 SelectedIndexChanged)事件均未引用当前选项卡。【参考方案3】:TabControl
有一个 TabPages 的集合,您可以对每个集合强制验证,例如:
public partial class MyForm : Form
public MyForm()
InitializeComponent();
foreach (var page in _tabControl.TabPages.Cast<TabPage>())
page.CausesValidation = true;
page.Validating += new CancelEventHandler(OnTabPageValidating);
void OnTabPageValidating(object sender, CancelEventArgs e)
TabPage page = sender as TabPage;
if (page == null)
return;
if (/* some validation fails */)
e.Cancel = true;
【讨论】:
我之前使用过验证事件并再次考虑过它,但对于这个应用程序来说,它已经超出了我的需要。不过谢谢。以上是关于如何在 SelectedIndexChanged 事件之前检测 TabControl 中标签页的更改?的主要内容,如果未能解决你的问题,请参考以下文章
仅在单击指定按钮时如何启动 DropDownList SelectedIndexChanged 事件?
c#中,如何对COMBOBOX的SelectedIndexChanged事件分别执行程序?
无法在组合框c#(和xaml)中执行selectedIndexChanged