【问题标题】:I can't click at last cell in table layout panel我无法单击表格布局面板中的最后一个单元格
【发布时间】:2016-03-05 13:39:48
【问题描述】:

当我想单击 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++;
        }
    }

【问题讨论】:

  • 似乎e.Location 是从面板左上角的实际屏幕偏移量,而您的代码计算布局面板坐标中的偏移量。因此 e.Location 永远不会大到足以指向最初看不到的行。对于您使用的面板,也许有一些像msdn.microsoft.com/en-us/library/… 这样的属性。在最坏的情况下,您可以在每个单元格中放置一个单独的面板并将其 Tag 属性设置为其位置。
  • 然后您可以使用相同的事件处理程序处理每个面板的点击。

标签: c# tablelayoutpanel


【解决方案1】:

您需要在计算中包含滚动位置..:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多