2016-03-03 85 views
1

我有一個問題。 我有一個tableLayoutPanel與2行和2列。第一柱是空的,而第二柱是一些東西。我知道檢測到一個被點擊的單元格,但我不知道如何用紅色科羅爾填充這個單擊的單元格。 有些建議?這裏是我的代碼:如何在鼠標點擊後用顏色填充單元格?

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

是的,我正在使用winforms – Miloss

+0

這是繪製特定單元的良好開端。它是由paint事件引發的,所以我們將不得不將其擴展到單元格單擊工作.. [Stack Overflow Thread](http://stackoverflow.com/questions/14877012/changing-cell-colours-of-a -tablelayoutpanel-by-variables-during-runtime) –

+0

[這裏是另一個鏈接](http://stackoverflow.com/questions/35404110/mouse-move-on-a-cell-of-my-tablelayoutpanel/35410059?s = 3 | 2.0026#35410059)你可能會覺得有用 – TaW

回答

1

使用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我使用的不是像素位置,而是細胞座標!

+0

謝謝@TaW,它工作正常。 – Miloss

1

所以..下面的代碼將工作,但我不特別喜歡它......特別是,我猜測有一個更優雅的方法來觸發paint事件,並將參數傳遞給上述事件。有基於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; 
     } 

    } 
} 

注意事項是,當你點擊一個紅細胞,它一直顯示爲紅色,所以你需要添加的問候什麼檢測細胞紅/不紅。再次,別人可能會有一個比這更優雅的解決方案,所以請留意。

+1

謝謝!它也可以工作! – Miloss

+0

我正在刪除,但繼續前進,並將其留下。但我肯定會與其他解決方案。由於某種原因,我無法讓CellPaint事件觸發Invalidate調用,可能是因爲如果必須猜測,我將矩形傳遞給它。 –

相關問題