c# - 是否可以将 Windows 窗体中的表格用作矩阵?

标签 c# winforms matrix

我正在尝试创建一个简单的 6X8 单元格矩阵,用户可以在其中单击一个单元格并将其打开或关闭,黑色或白色。我一直在尝试使用 Windows 窗体控件并查看数据网格控件,但到目前为止我还看不到使用 Winforms 工具箱中的任何东西来创建矩阵的方法。

我创建了表格,但看不到单独设置每个单元格样式的方法,也看不到对每个单元格使用 onclick 事件的方法。这可能吗?如果不可能,还有其他方法吗?

最佳答案

这是一个在运行时创建标签的解决方案。您需要一个面板来托管您的“矩阵”和一个按钮,所有这些都具有默认名称。单击该按钮将绘制一个棋盘格,您可以通过单击每个单元格来翻转颜色。

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

  const int RowCount = 6;
  const int ColumnCount = 8;
  private void button1_Click(System.Object sender, System.EventArgs e)
  {
    for (int i = 0; i < RowCount; i++)
    {
      for (int j = 0; j < ColumnCount; j++)
      {
        Label lbl = new Label();
        lbl.Size = new Size(20, 20);
        lbl.Location = new Point(i * 20, j * 20);
        lbl.BackColor = (i + j) % 2 == 0 ? Color.Black : Color.White;
        lbl.Click += lbl_Click;
        panel1.Controls.Add(lbl);
      }
    }

    MessageBox.Show(CountCellsOfColor(Color.Black).ToString());
  }

  private int CountCellsOfColor(Color color)
  {
    int count = 0;
    foreach (Label lbl in panel1.Controls.OfType<Label>())
    {                
      if (lbl.BackColor == color) count += 1;
    }
    return count;
  }

  private void lbl_Click(object sender, System.EventArgs e)
  {
    Label lbl = (Label)sender;
    Color color = lbl.BackColor;
    if (color == System.Drawing.Color.Black)
    {
      color = System.Drawing.Color.White;
    }
    else
    {
      color = System.Drawing.Color.Black;
    }
    lbl.BackColor = color;
  }   
}     

VB.NET 版本(原始版本,后来转换为 C#,但决定保留以备不时之需):

Option Strict On
Public Class Form1
  Const RowCount As Integer = 6
  Const ColumnCount As Integer = 8

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    For i = 0 To RowCount - 1
      For j = 0 To ColumnCount - 1
        Dim lbl As New Label
        lbl.Size = New Size(20, 20)
        lbl.Location = New Point(i * 20, j * 20)
        lbl.BackColor = If((i + j) Mod 2 = 0, Color.Black, Color.White)
        AddHandler lbl.Click, AddressOf lbl_Click
        Panel1.Controls.Add(lbl)
      Next
    Next

    MessageBox.Show(CountCellsOfColor(Color.Black))
  End Sub

  Private Function CountCellsOfColor(color As Color) As Integer
    Dim count As Integer = 0
    For Each lbl In Panel1.Controls.OfType(Of Label)()
      If lbl.BackColor = color Then count += 1
    Next
    Return count
  End Function

  Private Sub lbl_Click(sender As Object, e As System.EventArgs)
    Dim lbl As Label = CType(sender, Label)
    Dim color As Color = lbl.BackColor
    If color = Drawing.Color.Black Then
      color = Drawing.Color.White
    Else
      color = Drawing.Color.Black
    End If
    lbl.BackColor = color
  End Sub
End Class

关于c# - 是否可以将 Windows 窗体中的表格用作矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15231456/

相关文章:

c# - 使用 UserPrincipal 设置 DistinguishedName

c# - 如何在自述文件中将链接显示为纯文本

c# - 如何将多个字符串值传递给 C# 中的按钮单击事件处理程序

algorithm - 如何在内存方法中打印值-动态编程

c# - .NET和负载均衡器?

c# - c# .net 中的物理和数学常量和基本转换库

c# - 平面文件目标 预执行阶段失败。无法打开数据文件

c# - 如何避免在 C# 中进行类型检查以加载正确的 UI?

c++ - 打印关键点描述符矩阵 opencv 的值

R:当有平局时,在每行中查找具有最小值的列