我无法点击 table 布局面板中的最后一个单元格

I can't click at last cell in table layout panel

当我想单击 tableLayoutPanel 中的最后一个单元格时遇到问题。 当我 运行 一个程序时,它看起来像这样: enter image description here

接下来,当我点击我看到的最后一个单元格时,一切正常: enter image description here

但是当我滚动 tableLayoutPanel 并单击最后一个单元格时,它不会标记最后一个单元格,而是在滚动 TLP 之前标记最后一个单元格。

这是我的代码:

private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
    {
        row = 0;
        int verticalOffset = 0;
        foreach (int h in tableLayoutPanel1.GetRowHeights())
        {
            column = 0;
            int horizontalOffset = 0;
            foreach (int w in tableLayoutPanel1.GetColumnWidths())
            {
                Rectangle rectangle = new Rectangle(horizontalOffset, verticalOffset, w, h);
                if (rectangle.Contains(e.Location))
                {
                    if (column == 1) return;
                    Point cell = new Point(column, row);

                    if (!clickedCells.Contains(cell))
                    {

                        clickedCells.Add(cell);
                    }
                    else
                    {

                        clickedCells.Remove(cell);
                    }
                    tableLayoutPanel1.Invalidate();
                    MessageBox.Show(String.Format("row {0}, column {1} was clicked", row, column));
                    return;
                }
                horizontalOffset += w;
                column++;
            }
            verticalOffset += h;
            row++;
        }
    }

您需要在计算中包括滚动位置..:[=​​11=]

private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
    var asp = tableLayoutPanel1.AutoScrollPosition;  // <<===
    row = 0;
    int verticalOffset = asp.Y;                      // <<===
    foreach (int h in tableLayoutPanel1.GetRowHeights())
    {
        column = 0;
        int horizontalOffset = asp.X;                // <<===
        foreach (int w in tableLayoutPanel1.GetColumnWidths())
        {
            Rectangle rectangle = new Rectangle(horizontalOffset, verticalOffset, w, h);
            if (rectangle.Contains(e.Location))
            {
                if (column == 1) return;
                Point cell = new Point(column, row);
                if (!clickedCells.Contains(cell))
                {    clickedCells.Add(cell);       }
                else
                {    clickedCells.Remove(cell);    }
                tableLayoutPanel1.Invalidate();
                MessageBox.Show(String.Format("row {0}, column {1} was clicked", 
                                row, column));
                return;
            }
            horizontalOffset += w;
            column++;
        }
        verticalOffset += h;
        row++;
    }
}