C# 如何确定右键单击了哪个选项卡?

C# 如何确定右键单击了哪个选项卡?,c#,tabs,C#,Tabs,我看到这个问题被问了好几次,都是同一个答案。由于某些原因,它在我的程序中无法正常工作 这是每个人对这个问题的基本回答 for (int i = 0; i < tabs.TabCount; ++i) { if (tabs.GetTabRect(i).Contains(e.Location)) { //tabs.Controls[i]; // this is your tab } } 正如您可以看到的,位置(2+56=58)在第一个选项卡中,即使我单击第二个选项卡

我看到这个问题被问了好几次,都是同一个答案。由于某些原因,它在我的程序中无法正常工作

这是每个人对这个问题的基本回答

for (int i = 0; i < tabs.TabCount; ++i) {
    if (tabs.GetTabRect(i).Contains(e.Location)) {
     //tabs.Controls[i]; // this is your tab
    }
}

正如您可以看到的,位置(2+56=58)在第一个选项卡中,即使我单击第二个选项卡

我做错了什么?这个代码重复了很多次,我很难相信它不起作用。看起来e.位置的起始位置与选项卡的起始位置不同

更新:这是我正在运行的例程,当您右键单击选项卡以打开关联菜单时

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
        }
    }
}
private void cmpClose\u MouseUp(对象发送方,MouseEventArgs e)
{
OpenPDF当前OpenPDF;
//遍历所有选项卡页面
对于(int i=0;i
您可以为TabControl设置所选事件,并从EvenArg中拉出所选选项卡

private void tabControlStudent_Selected(object sender, TabControlEventArgs e) 
{
  if (e.TabPage == tabPageGuardianInfo)
  {
    loadGuardianList();
    selectGuardian();
  }
  else if (e.TabPage == tabPageTransactionInfo)
  {
    loadTransactions();
    loadPaymentAccount();
  }
}

正如Rajeev在评论中指出的,我们看不到click事件处理程序是如何连接的,所以这可能是问题所在。做下面的工作对我很有用

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);
           }
       }             
   }
}

从ContextMenu获得的e.Location值与TabPage标题的矩形区域没有关系

尝试将该值存储在TabControl的MouseUp值中:

Point tabMouse = Point.Empty;

void tcDocuments_MouseUp(object sender, MouseEventArgs e) {
  tabMouse = e.Location;
}
现在,您可以使用菜单项的正确单击事件:

void printPDFToolStripMenuItem_Click(object sender, EventArgs e) {
  for (int i = 0; i < tcDocuments.TabCount; ++i) {
    if (tcDocuments.GetTabRect(i).Contains(tabMouse)) {
      // do your stuff
    }
  }
}
void printPDFToolStripMenuItem\u单击(对象发送方,事件参数e){
对于(int i=0;i
在哪个位置单击第一个选项卡的左上角?我假设这是一个Winforms应用程序,您使用的是Winforms附带的标准选项卡控件。但不清楚你的点击事件处理程序是如何连接的。。。您是在处理选项卡控件本身、某个选项卡页面还是窗体本身上的单击事件?“e.Location”来源将取决于您处理单击事件的控件。请提供更多的细节,以及您试图实现的总体目标。可能有比尝试使用鼠标单击位置进行点击测试更简单的方法。我正在使用关联菜单上的mouseup事件,但光标位于选项卡上。我不希望要求选择选项卡。谢谢您是否希望单击但不一定选中“什么”选项卡?我在你的标题中看到你说点击了,但在问题主体中你说右键点击了。是否要捕获未选中选项卡上的右键单击?是。我知道如何分辨是右键单击还是左键单击,因此我没有在标题中进行区分。可能值得更新您的问题以消除任何混淆。这不起作用,请阅读原始问题。我已经更新了这个问题,包括Mouseup例程。
Point tabMouse = Point.Empty;

void tcDocuments_MouseUp(object sender, MouseEventArgs e) {
  tabMouse = e.Location;
}
void printPDFToolStripMenuItem_Click(object sender, EventArgs e) {
  for (int i = 0; i < tcDocuments.TabCount; ++i) {
    if (tcDocuments.GetTabRect(i).Contains(tabMouse)) {
      // do your stuff
    }
  }
}