我有一个TabControl
我想阻止添加现有的TabPage
(它们由名称标识),而是将其设置SelectedTabPage
为这个精确的选项卡。
我想知道在将页面添加到TabControl
. 如果不是,使用 (list) 的事件CollectionChanged
是否TabPages
是正确的选择?
我相信您正在寻找的事件是Control.ControlAdded
事件:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controladded.aspx
如果这还检测到何时添加了选项卡页面本身内的内容,则您应该能够使用事件处理程序中TabPage
的属性过滤除控件之外的所有内容。ControlEventArgs.Control
拒绝添加控件会稍微复杂一些。由于此事件似乎仅在添加控件后引发,因此您需要执行以下操作:
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 方法将集合复制到数组中。
如果您愿意,您可以通过在检查现有页面中添加一个ExtensionMethod
来清理您的代码,设置焦点或从那里添加。TabControl
例子:
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);