如何确定右键单击了哪个选项卡?
How to determine which tab was right clicked on?
我看到这个问题被问过很多次,所有的答案都是一样的。由于某种原因,它在我的程序中无法正常工作。
这是大家对这个问题给出的基本答案...
for (int i = 0; i < tabs.TabCount; ++i) {
if (tabs.GetTabRect(i).Contains(e.Location)) {
//tabs.Controls[i]; // this is your tab
}
}
这与我使用的代码相同,但是当我右键单击第二个选项卡时,它总是会关闭第一个选项卡。
当我调试问题时,这是我得到的...
e.Location: x=57, y=7
rect(0): x=2, y=2, width=56, height=18
rect(1): x=58, y=2, width=99, height=18
如您所见,位置 (2 + 56 = 58) 位于第一个选项卡中,即使我单击第二个选项卡也是如此。
我做错了什么?这段代码重复了很多次,我很难相信它不起作用。看起来 e.Location 的起始位置与选项卡的起始位置不同。
更新:这是我 运行 的例程,当您右键单击选项卡以调出上下文菜单时。
private void cmpClose_MouseUp(object sender, MouseEventArgs e)
{
OpenPDF currentOpenPDF;
// iterate through all the tab pages
for (int i = 0; i < tcDocuments.TabCount; i++)
{
// get their rectangle area and check if it contains the mouse cursor
if (tcDocuments.GetTabRect(i).Contains(e.Location))
{
// Do something to the tab
}
}
}
您可以为 TabControl 设置选定事件并从 EvenArg 中拉出选定的选项卡。
private void tabControlStudent_Selected(object sender, TabControlEventArgs e)
{
if (e.TabPage == tabPageGuardianInfo)
{
loadGuardianList();
selectGuardian();
}
else if (e.TabPage == tabPageTransactionInfo)
{
loadTransactions();
loadPaymentAccount();
}
}
正如 Rajeev 在评论中指出的那样,我们看不到您的点击事件处理程序是如何附加的,所以这可能是问题所在。执行以下操作对我有用。
public MainWindow()
{
InitializeComponent();
this.tabControl1.MouseClick += tabControl1_MouseClick;
}
void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
for (int i = 0; i < tabControl1.TabCount; i++)
{
if (tabControl1.GetTabRect(i).Contains(e.Location))
{
Console.WriteLine("Right Clicked on tab {0}", i);
}
}
}
}
更新:查看点击位置与矩形,我和你一样,虽然我只在位置为 58 时更改选项卡,即使在 56 时理论上我应该在选项卡 1 上方。发生这种情况是因为它们重叠,活动选项卡将在其他选项卡上方每边 2 个。
以上两个实例的位置:
Right Clicked on tab 0
{X=57,Y=7}
{X=2,Y=2,Width=56,Height=18}
{X=58,Y=2,Width=99,Height=18}
Right Clicked on tab 1
{X=58,Y=7}
{X=2,Y=2,Width=56,Height=18}
{X=58,Y=2,Width=99,Height=18}
您从 ContextMenu 获得的 e.Location 值与 TabPage 的矩形区域没有关系 header。
尝试将值存储在 TabControl 的 MouseUp 值中:
Point tabMouse = Point.Empty;
void tcDocuments_MouseUp(object sender, MouseEventArgs e) {
tabMouse = e.Location;
}
现在您只需使用菜单项的正确 Click 事件即可:
void printPDFToolStripMenuItem_Click(object sender, EventArgs e) {
for (int i = 0; i < tcDocuments.TabCount; ++i) {
if (tcDocuments.GetTabRect(i).Contains(tabMouse)) {
// do your stuff
}
}
}
我看到这个问题被问过很多次,所有的答案都是一样的。由于某种原因,它在我的程序中无法正常工作。
这是大家对这个问题给出的基本答案...
for (int i = 0; i < tabs.TabCount; ++i) {
if (tabs.GetTabRect(i).Contains(e.Location)) {
//tabs.Controls[i]; // this is your tab
}
}
这与我使用的代码相同,但是当我右键单击第二个选项卡时,它总是会关闭第一个选项卡。
当我调试问题时,这是我得到的...
e.Location: x=57, y=7
rect(0): x=2, y=2, width=56, height=18
rect(1): x=58, y=2, width=99, height=18
如您所见,位置 (2 + 56 = 58) 位于第一个选项卡中,即使我单击第二个选项卡也是如此。
我做错了什么?这段代码重复了很多次,我很难相信它不起作用。看起来 e.Location 的起始位置与选项卡的起始位置不同。
更新:这是我 运行 的例程,当您右键单击选项卡以调出上下文菜单时。
private void cmpClose_MouseUp(object sender, MouseEventArgs e)
{
OpenPDF currentOpenPDF;
// iterate through all the tab pages
for (int i = 0; i < tcDocuments.TabCount; i++)
{
// get their rectangle area and check if it contains the mouse cursor
if (tcDocuments.GetTabRect(i).Contains(e.Location))
{
// Do something to the tab
}
}
}
您可以为 TabControl 设置选定事件并从 EvenArg 中拉出选定的选项卡。
private void tabControlStudent_Selected(object sender, TabControlEventArgs e)
{
if (e.TabPage == tabPageGuardianInfo)
{
loadGuardianList();
selectGuardian();
}
else if (e.TabPage == tabPageTransactionInfo)
{
loadTransactions();
loadPaymentAccount();
}
}
正如 Rajeev 在评论中指出的那样,我们看不到您的点击事件处理程序是如何附加的,所以这可能是问题所在。执行以下操作对我有用。
public MainWindow()
{
InitializeComponent();
this.tabControl1.MouseClick += tabControl1_MouseClick;
}
void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
for (int i = 0; i < tabControl1.TabCount; i++)
{
if (tabControl1.GetTabRect(i).Contains(e.Location))
{
Console.WriteLine("Right Clicked on tab {0}", i);
}
}
}
}
更新:查看点击位置与矩形,我和你一样,虽然我只在位置为 58 时更改选项卡,即使在 56 时理论上我应该在选项卡 1 上方。发生这种情况是因为它们重叠,活动选项卡将在其他选项卡上方每边 2 个。
以上两个实例的位置:
Right Clicked on tab 0
{X=57,Y=7}
{X=2,Y=2,Width=56,Height=18}
{X=58,Y=2,Width=99,Height=18}
Right Clicked on tab 1
{X=58,Y=7}
{X=2,Y=2,Width=56,Height=18}
{X=58,Y=2,Width=99,Height=18}
您从 ContextMenu 获得的 e.Location 值与 TabPage 的矩形区域没有关系 header。
尝试将值存储在 TabControl 的 MouseUp 值中:
Point tabMouse = Point.Empty;
void tcDocuments_MouseUp(object sender, MouseEventArgs e) {
tabMouse = e.Location;
}
现在您只需使用菜单项的正确 Click 事件即可:
void printPDFToolStripMenuItem_Click(object sender, EventArgs e) {
for (int i = 0; i < tcDocuments.TabCount; ++i) {
if (tcDocuments.GetTabRect(i).Contains(tabMouse)) {
// do your stuff
}
}
}