向 TabControl 容器中的选项卡添加右键单击事件
Add a right click event to a tab in a TabControl container
在一个表单中,我有一个选项卡容器,我通过使用按钮在其中动态添加选项卡。由于我知道没有简单的方法(然后我是 WinForms 新手)关闭所选选项卡,我想设置一个事件处理程序来处理右键单击,通过该选项卡将关闭。简而言之,我想右键单击所选选项卡以将其关闭。
这是我编写的事件处理程序(但不起作用):
private void tab_Click(object sender, EventArgs e)
{
MouseEventArgs me = (MouseEventArgs)e;
if (sender == tabControl1.SelectedTab && me.Button == MouseButtons.Right)
{
tabControl1.TabPages.Remove(tabControl1.SelectedTab);
}
}
我想这种方法太天真了吧?当我单击选项卡时,处理程序甚至没有注册右键单击。对如何使这项工作有任何建议吗?
private void tabControl1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Application.Exit();
}
else
{
}
}
您这里的代码非常不稳定。不要盲目地转换 EventArgs 对象,只需使用 MouseClick 事件即可。不要盲目希望 SelectedTab 是被点击的那一个,那是稍后发生的。而且永远不会,永远不会 那样使用 Remove() 方法,处理 TabPage 及其控件非常重要。如果您不这样做,那么这些控件将永久泄漏,这种错误最终会导致您的程序崩溃并出现不可调试的异常,例如 "Error creating window".
让它看起来像这样:
private void tabControl1_MouseClick(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Right) {
for (int ix = 0; ix < tabControl1.TabCount; ++ix) {
if (tabControl1.GetTabRect(ix).Contains(e.Location)) {
tabControl1.TabPages[ix].Dispose();
break;
}
}
}
}
在一个表单中,我有一个选项卡容器,我通过使用按钮在其中动态添加选项卡。由于我知道没有简单的方法(然后我是 WinForms 新手)关闭所选选项卡,我想设置一个事件处理程序来处理右键单击,通过该选项卡将关闭。简而言之,我想右键单击所选选项卡以将其关闭。
这是我编写的事件处理程序(但不起作用):
private void tab_Click(object sender, EventArgs e)
{
MouseEventArgs me = (MouseEventArgs)e;
if (sender == tabControl1.SelectedTab && me.Button == MouseButtons.Right)
{
tabControl1.TabPages.Remove(tabControl1.SelectedTab);
}
}
我想这种方法太天真了吧?当我单击选项卡时,处理程序甚至没有注册右键单击。对如何使这项工作有任何建议吗?
private void tabControl1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Application.Exit();
}
else
{
}
}
您这里的代码非常不稳定。不要盲目地转换 EventArgs 对象,只需使用 MouseClick 事件即可。不要盲目希望 SelectedTab 是被点击的那一个,那是稍后发生的。而且永远不会,永远不会 那样使用 Remove() 方法,处理 TabPage 及其控件非常重要。如果您不这样做,那么这些控件将永久泄漏,这种错误最终会导致您的程序崩溃并出现不可调试的异常,例如 "Error creating window".
让它看起来像这样:
private void tabControl1_MouseClick(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Right) {
for (int ix = 0; ix < tabControl1.TabCount; ++ix) {
if (tabControl1.GetTabRect(ix).Contains(e.Location)) {
tabControl1.TabPages[ix].Dispose();
break;
}
}
}
}