【发布时间】:2009-04-13 20:21:46
【问题描述】:
有没有简单(5 行代码)的方法来做到这一点?
【问题讨论】:
有没有简单(5 行代码)的方法来做到这一点?
【问题讨论】:
删除单击鼠标中键的选项卡的最短代码是使用 LINQ。
确保事件已连接this.tabControl1.MouseClick += tabControl1_MouseClick;
对于处理程序本身
private void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
var tabControl = sender as TabControl;
var tabs = tabControl.TabPages;
if (e.Button == MouseButtons.Middle)
{
tabs.Remove(tabs.Cast<TabPage>()
.Where((t, i) => tabControl.GetTabRect(i).Contains(e.Location))
.First());
}
}
如果你正在争取最少的行数,这里是一行
tabControl1.MouseClick += delegate(object sender, MouseEventArgs e) { var tabControl = sender as TabControl; var tabs = tabControl.TabPages; if (e.Button == MouseButtons.Middle) { tabs.Remove(tabs.Cast<TabPage>().Where((t, i) => tabControl.GetTabRect(i).Contains(e.Location)).First()); } };
【讨论】:
没有 LINQ 的解决方案没有那么紧凑和美观,但也很实际:
private void TabControlMainMouseDown(object sender, MouseEventArgs e)
{
var tabControl = sender as TabControl;
TabPage tabPageCurrent = null;
if (e.Button == MouseButtons.Middle)
{
for (var i = 0; i < tabControl.TabCount; i++)
{
if (!tabControl.GetTabRect(i).Contains(e.Location))
continue;
tabPageCurrent = tabControl.TabPages[i];
break;
}
if (tabPageCurrent != null)
tabControl.TabPages.Remove(tabPageCurrent);
}
}
【讨论】:
没有足够的积分对提供的解决方案发表评论,但它们都存在相同的缺陷:已删除选项卡中的控件未释放。
问候
【讨论】:
你可以这样做:
private void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Middle)
{
// choose tabpage to delete like below
tabControl1.TabPages.Remove(tabControl1.TabPages[0]);
}
}
基本上,您只是在选项卡控件上单击鼠标,并且仅在单击中间按钮时才删除页面。
【讨论】:
TabPage .这只会删除特定的TabPage - 例如如果用户想要删除 TabPage 2,并且他中键单击标签,它将删除 TabPage 1,这是不是 OP 要求什么。