代码之家  ›  专栏  ›  技术社区  ›  Miloss

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

  •  0
  • Miloss  · 技术社区  · 9 年前

    当我想单击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++;
            }
        }
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   TaW    9 年前

    您需要在计算中包括滚动位置。:

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