TabControl AddingTab event
本文关键字:event AddingTab TabControl | 更新日期: 2023-09-27 18:22:05
我有一个TabControl
,我想在其中阻止添加现有的TabPage
(它们由名称标识),而是将SelectedTabPage
设置为这个精确的选项卡。
我想知道是否有一个事件会在页面添加到TabControl
之前触发。如果不是,使用TabPages
(列表)的事件CollectionChanged
是否是正确的替代方案?
我相信您要查找的事件是Control.ControlAdded
事件:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controladded.aspx
如果这也检测到何时添加了选项卡页面内部的内容,则应该能够使用事件处理程序中的ControlEventArgs.Control
属性筛选出除TabPage
控件之外的所有内容。
拒绝添加控件会稍微复杂一些。由于此事件似乎只有在添加控件后才会引发,因此您需要执行以下操作:
void onControlAdded(object sender, ControlEventArgs e) {
var tab = e as TabPage;
if (tab == null)
return;
this.myTabControlObject.TabPages.Remove(tab);
}
这应该删除选项卡,但它可能会大大减慢选项卡添加过程。
尝试这样的操作,我正在TabControl
页面集合中检查与要添加的页面同名的页面,如果存在,我将焦点设置为现有实例,否则将新页面添加到TabControl
。看看这样的东西是否适合你。
private void button1_Click(object sender, EventArgs e)
{
TabPage tp = new TabPage();
tp.Name = tabPage1.Name;
var temp =tabControl1.Controls.Find(tp.Name,true);
if( temp.Length > 0)
{
tabControl1.SelectedTab = (TabPage) temp[0];
}
else
tabControl1.Controls.Add(tp);
}
与ControlCollection
有关的任何事情都很可能在添加控件之后被触发。
来自以上链接:
您可以通过将控件传递到Contains方法来确定控件是否是集合的成员。若要获取集合中控件位置的索引值,请将该控件传递到IndexOf方法中。可以通过调用CopyTo方法将集合复制到数组中。
如果你愿意,你可以通过在TabControl
中添加ExtensionMethod
来清理你的代码。检查现有页面,设置焦点或从那里添加。
示例:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static bool AddPage(this TabControl tc, TabPage tp)
{
var matchedPages = tc.Controls.Find(tp.Name, false);
if ( matchedPages.Length > 0)
{
tc.SelectedTab = (TabPage)matchedPages[0];
return true;
}
else
{
tc.TabPages.Add(tp);
tc.SelectedTab = tp;
return false;
}
}
}
}
用法:
tabControl1.AddPage(tp);