web-dev-qa-db-ja.com

TableLayoutPanelでセルの色を動的に設定するにはどうすればよいですか?

プログラム実行中の条件に応じて、TableLayoutPanelセルの色を設定する関数を作成する必要があります。

TableLayoutPanelは16x16で除算されます。プログラムの開始時にいくつかの条件があります。セルの条件が真である場合、この販売は青色に塗る必要があります。例えば:

private void start_Click(object sender, EventArgs e)
{
    foreach (string str in some_list)
    {
       if (some condition)
       {
           set_color_in_cell at row[i] colum[j] //(what shoud i use here?)
       }
    }
}

私はそのような例を見つけました:

private void tableLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    if (e.Row == 0 && e.Column == 1)
    {
        e.Graphics.FillRectangle(new SolidBrush(Color.Black), e.CellBounds);
    }
}

でも使い方がわかりません。誰かがこれについて知っているなら、私を助けてください。

private void start_Click(object sender, EventArgs e)
{
    string SyncAnswer = "";
    foreach (string file_string in Data_from_file)
    {
       COM_Port.WriteLine(file_string);
       while (SyncAnswer != "READY")
       {
           SyncAnswer = COM_Port.ReadLine();
           if (SyncAnswer.Substring(0, 4) == "Fire")
           {
              //raise event
              //Paint for example a cell in Row=i Colum=j
           }
           else if (SyncAnswer.Substring(0, 4) == "Skip")
          {
             //raise event
          }
      }
   }
}
5
Sergey

オプション1 CellPaint イベントの使用

ステップバイステップの例を次に示します。

  1. Formを作成します
  2. ツールボックスから TableLayoutPanelFormに配置します
  3. デザイン面でtableLayoutPanel1を選択し、を押します F4 プロパティを表示するためのキー。
  4. プロパティグリッドのツールバーから、プロパティを表示するように選択できます enter image description here またはイベント enter image description here。イベントアイコンをクリックし、リストから CellPaint eventをダブルクリックして、コードにtableLayoutPanel1_CellPaintイベントハンドラーを作成します。
  5. この方法では、いくつかの基準に基づいて、各セルの背景をペイントできます。イベントは各セルの背景をペイントするために発生し、e.Rowは行インデックス、e.Columnは列インデックス、e.CellBoundsはペイントセルのバインドです。

たとえば、以下のサンプルでは、​​黒い背景if ((e.Column + e.Row) % 2 == 1)を描画します。それ以外の場合は、白い背景を描画します。

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    if ((e.Column + e.Row) % 2 == 1)
        e.Graphics.FillRectangle(Brushes.Black, e.CellBounds);
    else
        e.Graphics.FillRectangle(Brushes.White, e.CellBounds);
}

enter image description here

色を動的に変更するには

プログラムの別のポイントから色を変更するには、たとえばボタンのClickイベントで、各セルの色を2次元配列に格納し、その色を使用してそのセルのブラシを作成する必要があります。

フォームでbgColorsを定義します。

Color[,] bgColors = new Color[2, 2] {
    { SystemColors.Control, SystemColors.Control }, 
    { SystemColors.Control, SystemColors.Control } 
};

この方法でセルの背景を描画します。

private void tableLayoutPanel1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    using (var b = new SolidBrush(bgColors[e.Column, e.Row]))
    {
        e.Graphics.FillRectangle(b , e.CellBounds);
    }
}

BackColorCellを変更するには、次のことができます。

private void Button1_Click(object sender, EventArgs e)
{
    //column: 0 ,row: 1
    bgColors[0, 1] = Color.Red;
    tableLayoutPanel1.Refresh();
}

オプション2-セル内のホスティングパネル

別の簡単なオプションとして、各セルにPanelを配置し、DockPanelプロパティをFillに設定し、そのMarginプロパティを0,0に設定すると、位置(column, row)でパネルの色を変更するたびに次のことができます。

this.tableLayoutPanel1.GetControlFromPosition(column, row).BackColor = Color.Red;
25
Reza Aghaei