1

我有一个TabControl我想阻止添加现有的TabPage(它们由名称标识),而是将其设置SelectedTabPage为这个精确的选项卡。

我想知道在将页面添加到TabControl. 如果不是,使用 (list) 的事件CollectionChanged是否TabPages是正确的选择?

4

2 回答 2

1

我相信您正在寻找的事件是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);
}

应该会删除标签,但它可能会大大减慢标签添加过程。

于 2013-07-12T19:13:47.443 回答
1

尝试这样的事情,我正在检查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);
于 2013-07-12T19:24:50.977 回答