当我不控制子对象时,从子对象中识别父对象

时间:2015-01-15 00:33:51

标签: c# winforms

当您在创建时无法在子对象中设置数据时,是否存在用于标识复合对象中子对象的父对象的标准模式?

我正在制作一个象棋棋盘。该板由一组图片框组成。为了模板,我保留了一个“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控件的那种访问。

1 个答案:

答案 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());
}