单击鼠标后如何用颜色填充单元格?
How can I fill a cell with color after mouse click?
我有一个问题。
我有一个包含 2 行和 2 列的 tableLayoutPanel。第一列是空的,第二列是东西。我知道检测到一个被点击的单元格,但我不知道如何用红色填充这个被点击的单元格。
一些建议?这是我的代码:
private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
int row = 0;
int verticalOffset = 0;
foreach (int h in tableLayoutPanel1.GetRowHeights())
{
int column = 0;
int horizontalOffset = 0;
foreach (int w in tableLayoutPanel1.GetColumnWidths())
{
Rectangle rectangle = new Rectangle(horizontalOffset, verticalOffset, w, h);
if (rectangle.Contains(e.Location))
{
MessageBox.Show(String.Format("row {0}, column {1} was clicked", row, column));
return;
}
horizontalOffset += w;
column++;
}
verticalOffset += h;
row++;
}
}
使用 List<T>
跟踪已点击的单元格:
List<Point> clickedCells = new List<Point>();
..您可以将找到的添加到列表中:
if (rectangle.Contains(e.Location))
{
// *
Point cell = new Point(column, row);
if (!clickedCells.Contains(cell)) clickedCells.Add(cell);
// **
tableLayoutPanel1.Invalidate();
return;
}
要关闭颜色并在再次单击时重新打开,您可以在此处添加一个 else 子句 (**):
else clickedCells.Remove(cell);
如果只绘制一个单元格,要么只使用一个点,要么简单地清除此处的列表 (*)
clickedCells.Clear();
Invalidating
TLP 将触发 CellPaint
事件,处理列表的位置:
private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
if (clickedCells.Contains(new Point(e.Column,e.Row)))
e.Graphics.FillRectangle(Brushes.Red, e.CellBounds);
}
请注意,我使用的 Points
不是像素位置,而是单元格坐标!
所以..下面的代码可以工作,但我不是特别喜欢它..具体来说,我猜想有一种更优雅的方法来触发绘画事件,并将参数传递给所述事件。有基于 CellPaint 事件的帖子,但我不知道如何触发它。所以..
public partial class Form1 : Form
{
Rectangle clicked = new Rectangle();
bool wasClick = false;
public Form1()
{
InitializeComponent();
}
private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
int row = 0;
int verticalOffset = 0;
int clickx = e.X;
int clicky = e.Y;
foreach (int h in tableLayoutPanel1.GetRowHeights())
{
int column = 0;
int horizontalOffset = 0;
foreach (int w in tableLayoutPanel1.GetColumnWidths())
{
Rectangle rectangle = new Rectangle(horizontalOffset, verticalOffset, w, h);
if (rectangle.Contains(e.Location))
{
MessageBox.Show(String.Format("row {0}, column {1} was clicked", row, column));
clicked = rectangle;
wasClick = true;
tableLayoutPanel1.Invalidate(rectangle);
return;
}
horizontalOffset += w;
column++;
}
verticalOffset += h;
row++;
}
}
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
if (wasClick)
{
Graphics g = e.Graphics;
Rectangle r = clicked;
g.FillRectangle(Brushes.Red, r);
wasClick = false;
}
}
}
注意事项是,当您单击红色单元格时,它会保持红色,因此您需要添加关于哪些单元格是红色/不是红色的检测。同样,其他人可能有比这更优雅的解决方案,所以请留意。
我有一个问题。 我有一个包含 2 行和 2 列的 tableLayoutPanel。第一列是空的,第二列是东西。我知道检测到一个被点击的单元格,但我不知道如何用红色填充这个被点击的单元格。 一些建议?这是我的代码:
private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
int row = 0;
int verticalOffset = 0;
foreach (int h in tableLayoutPanel1.GetRowHeights())
{
int column = 0;
int horizontalOffset = 0;
foreach (int w in tableLayoutPanel1.GetColumnWidths())
{
Rectangle rectangle = new Rectangle(horizontalOffset, verticalOffset, w, h);
if (rectangle.Contains(e.Location))
{
MessageBox.Show(String.Format("row {0}, column {1} was clicked", row, column));
return;
}
horizontalOffset += w;
column++;
}
verticalOffset += h;
row++;
}
}
使用 List<T>
跟踪已点击的单元格:
List<Point> clickedCells = new List<Point>();
..您可以将找到的添加到列表中:
if (rectangle.Contains(e.Location))
{
// *
Point cell = new Point(column, row);
if (!clickedCells.Contains(cell)) clickedCells.Add(cell);
// **
tableLayoutPanel1.Invalidate();
return;
}
要关闭颜色并在再次单击时重新打开,您可以在此处添加一个 else 子句 (**):
else clickedCells.Remove(cell);
如果只绘制一个单元格,要么只使用一个点,要么简单地清除此处的列表 (*)
clickedCells.Clear();
Invalidating
TLP 将触发 CellPaint
事件,处理列表的位置:
private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
if (clickedCells.Contains(new Point(e.Column,e.Row)))
e.Graphics.FillRectangle(Brushes.Red, e.CellBounds);
}
请注意,我使用的 Points
不是像素位置,而是单元格坐标!
所以..下面的代码可以工作,但我不是特别喜欢它..具体来说,我猜想有一种更优雅的方法来触发绘画事件,并将参数传递给所述事件。有基于 CellPaint 事件的帖子,但我不知道如何触发它。所以..
public partial class Form1 : Form
{
Rectangle clicked = new Rectangle();
bool wasClick = false;
public Form1()
{
InitializeComponent();
}
private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
int row = 0;
int verticalOffset = 0;
int clickx = e.X;
int clicky = e.Y;
foreach (int h in tableLayoutPanel1.GetRowHeights())
{
int column = 0;
int horizontalOffset = 0;
foreach (int w in tableLayoutPanel1.GetColumnWidths())
{
Rectangle rectangle = new Rectangle(horizontalOffset, verticalOffset, w, h);
if (rectangle.Contains(e.Location))
{
MessageBox.Show(String.Format("row {0}, column {1} was clicked", row, column));
clicked = rectangle;
wasClick = true;
tableLayoutPanel1.Invalidate(rectangle);
return;
}
horizontalOffset += w;
column++;
}
verticalOffset += h;
row++;
}
}
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
if (wasClick)
{
Graphics g = e.Graphics;
Rectangle r = clicked;
g.FillRectangle(Brushes.Red, r);
wasClick = false;
}
}
}
注意事项是,当您单击红色单元格时,它会保持红色,因此您需要添加关于哪些单元格是红色/不是红色的检测。同样,其他人可能有比这更优雅的解决方案,所以请留意。