自定义TabControl以关闭单个选项卡

时间:2009-04-29 18:02:41

标签: c# winforms user-interface controls tabcontrol

我的方案如下:

我正在使用C#中的winforms应用程序,它在tabcontrol的主页面内有一个按钮,每次单击它时都会生成另一个tabpage。每个新标签页都将包含由用户控件定义的布局。

我的问题是:

  1. 如何让用户关闭其中一个在运行时动态创建的标签?

  2. 我如何修改tabcontrol本身,以便每个标签中都有一个小的“X”,用户可以点击该标签以关闭该特定标签? (像Firefox一样)

  3. 如果我想使用用户控件内的按钮关闭选项卡,如何将tabcontrol的SelectedIndex属性公开给用户控件?

7 个答案:

答案 0 :(得分:14)

我找到了这段代码,对我非常有帮助:

private void tabControl_MouseUp(object sender, MouseEventArgs e)
{
    // check if the right mouse button was pressed
    if(e.Button == MouseButtons.Right)
    {
        // iterate through all the tab pages
        for(int i = 0; i < tabControl1.TabCount; i++)
        {
            // get their rectangle area and check if it contains the mouse cursor
            Rectangle r = tabControl1.GetTabRect(i);
            if (r.Contains(e.Location))
            {
                // show the context menu here
                System.Diagnostics.Debug.WriteLine("TabPressed: " + i);
             }
        }
    }
}

TabControl: How To Capture Mouse Right-Click On Tab

答案 1 :(得分:9)

我在大约一年前创建了一个派生标签控件。我不会在这里发布消息来源,因为它大约有700行,并且编码非常混乱。也许我会找一些时间来清理代码然后在这里发布它。现在我将简要介绍它的构建方式。

每个标签页都有一个标有左侧的“X”图标,标签页支持通过拖放重新排序并在多个标签控件之间移动它们。

我选择了在标签页上获取图标的简便方法。选项卡控件具有TabControl.ImageList属性,标签页具有TabPage.ImageIndex属性。所以我只是在图像列表中添加了三个图标 - 正常,悬停,按下 - 并处理鼠标事件。

使用TabControl.GetTabRect(),您可以测试鼠标是否在特定标签页上,如果它位于图标上方,您可以通过一些数学运算来查看。然后,您只需根据鼠标按钮状态更改图标,如果按下按钮,最终会删除鼠标下的标签页。

此解决方案的主要问题是,计算鼠标是否在图标上方需要知道图标相对于标签页的绘制位置,这可能会随着新的Windows版本而改变。图标位于标题的左侧,但这看起来并不太糟糕。

答案 2 :(得分:6)

我做了以下事情: 在创建(添加)TabPage阶段,我添加了toolStrip

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

然后,创建X按钮并将其添加到toolstrip

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

点击X按钮

创建活动
ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

toolstrip添加到tabpage

tabControl1.TabPages[curenttabpage].Controls.Add(ts);
ToolStripButton_Click

现在如下:

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

也许它不是你想要的,但它会很好用。

答案 3 :(得分:2)

我创建了一个类似的设置。

在运行时添加到选项卡页面的每个控件都是从我创建的特殊基本控件派生的。这个基本控件有一个关闭按钮(以及一些其他功能,如安全关闭标志)。

关闭我在基本控件上使用的标签代码:

 TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;

tabControl.TabPages.Remove(parent);

答案 4 :(得分:1)

我知道这是一个旧线程,但我确实发现这个link允许您“隐藏”数组中的选项卡,然后您可以在运行时重新加载所需的选项卡。我把它添加到一个我可以轻易找到的地方。

答案 5 :(得分:0)

此代码可能有助于在鼠标中键单击时关闭选项卡控件:

            private void tabControl1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button != System.Windows.Forms.MouseButtons.Middle)
                    return;

                for (int i = 0; i < MainTabControl.TabPages.Count; i++)
                {
                    if (this.MainTabControl.GetTabRect(i).Contains(e.Location))
                    {
                        this.MainTabControl.TabPages.RemoveAt(i);
                        return;
                    }
                }
            }

答案 6 :(得分:-3)

没问题!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);