当您在创建时无法在子对象中设置数据时,是否存在用于标识复合对象中子对象的父对象的标准模式?
我正在制作一个象棋棋盘。该板由一组图片框组成。为了模板,我保留了一个“uxSquares”数组,其中包含图片框以及我需要的其他一些数据。类似于:
private class uxSquare
{
public int RowIndex { get; private set; }
public int ColumnIndex { get; private set; }
// ... other stuff
public uxSquare(int RowIndex, int ColumnIndex)
{
this.RowIndex = RowIndex;
this.ColumnIndex = ColumnIndex;
this.PictureBox = new PictureBox();
this.PictureBox.Name = "R" + RowIndex.ToString() +
"C" + ColumnIndex.ToString();
}
}
在表单加载期间,我创建了一个uxSquares的二维(row,col)数组,并将表单中的每个uxSquare的图片框放在网格布局中。随着每个Picture Box的创建,我将uxSquares [,]索引存储在PictureBox的名称中(见上面的uxSquare构造函数)。
for (int rowIndex = 0; rowIndex < countOfRows; rowIndex++)
{
for (int colIndex = 0; colIndex < countOfColumns; colIndex++)
{
// create the uxSquare array
uxSquares[rowIndex, colIndex] = new uxSquare(rowIndex, colIndex);
// ... place pictureBox in gridlayout, plus more stuff
}
}
当用户点击图片框时,我需要知道阵列中的哪个uxSquare拥有该图片框控件。目前,在Picture Boxes的共享点击处理程序中,我正在解析Sender对象的名称以获取uxSquares索引。
这似乎是一个严重的黑客攻击,将数组索引保留在控件的名称中。但是,我的替代方案似乎是保持一个单独的查找表映射图片框控件到uxSquare,这似乎是一个同样令人震惊的黑客。
当您在创建时无法在子对象中设置数据时,是否存在用于标识复合对象中子对象的父对象的标准模式?如果我拥有子对象,我会将父对象传递给它的构造函数然后保存它。但是,我没有对Picture Box控件的那种访问。
答案 0 :(得分:1)
您可以对图片框进行子类化,并将行索引和列索引传递给构造函数。
public class UxPicBox : PictureBox {
public UxPicBox(int col, int row) : base() {
this.Col = col;
this.Row = row;
}
public int Col { get; set; }
public int Row { get; set; }
}
这样,当click事件运行时,您可以将发件人转换为UxPicBox并获得找到UxSquare所需的内容。
编辑:这是点击事件的示例
void UxPicBox_Click(object sender, EventArgs e) {
UxPicBox pb = (UxPicBox)sender;
MessageBox.Show(pb.Col.ToString() + " -- " + pb.Row.ToString());
}