我有一个位20x23的矩阵 我需要在winform(GUI)中表示这个矩阵 想法是用户将能够通过单击表示矩阵中特定单元格的相关按钮来更改特定单元格的内容。 (当用户单击按钮时,矩阵中的相关位单元正在反转)
我考虑过使用GRID
,但由于GUI(设计)问题,无法使用它。
如何有效地创建和管理20x23(= 460)按钮并使其与真实矩阵保持相关?
答案 0 :(得分:1)
这并不困难,我会从一个为您生成按钮矩阵的方法开始。该矩阵由按钮组成,其中ID(即Tag)将对应于正确的cellNumber(您可能会考虑将坐标作为Point实例传递,我将把它留给您决定)。
基本上,它就是这样,所有按钮都在面板上呈现(panel1
):
...
#region Fields
//Dimensions for the matrix
private const int yDim = 20;
private const int xDim = 23;
#endregion
...
private void GenerateButtonMatrix()
{
Button[,] buttonMatrix = new Button[yDim, xDim];
InitializeMatrix(ref matrix); //Corresponds to the real matrix
int celNr = 1;
for (int y = 0; y < yDim; y++)
{
for (int x = 0; x < xDim; x++)
{
buttonMatrix[y,x] = new Button()
{
Width = Height = 20,
Text = matrix[y, x].ToString(),
Location = new Point( y * 20 + 10,
x * 20 + 10), // <-- You might want to tweak this
Parent = panel1,
};
buttonMatrix[y, x].Tag = celNr++;
buttonMatrix[y,x].Click += MatrixButtonClick;
}
}
}
如您所见,所有460个按钮都有一个连接到ClickEvent的自定义EventHandler,名为MatrixButtonClick()
。此事件处理程序将处理ClickEvent并可确定用户单击了哪个按钮。通过再次检索标记,您可以计算出与“真实”矩阵相对应的正确坐标。
private void MatrixButtonClick(object sender, EventArgs e)
{
if (sender is Button)
{
Button b = sender as Button;
//The tag contains the cellNr representing the cell in the real matrix
//To calculate the correct Y and X coordinate, use a division and modulo operation
//I'll leave that up to you :-)
.... Invert the real matrix cell value
}
}
我不会放弃一切,因为这是一个很好的练习,你可以实现:)。
答案 1 :(得分:0)
我愿意:
1)创建具有所需属性的对象
2)填写清单并填写值
3)迭代列表创建按钮并分配其点击处理程序和按钮的名称(名称类似于button_rowindex_colindex)
4)内部点击处理程序,通过检测单击了哪个按钮为对象单元格赋值