【发布时间】: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