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

Identifying a parent object from a child object, when I don't control the child object

在创建时无法在子对象中设置数据时,是否有一种标准模式来识别复合对象中子对象的父对象?

我正在制作一个类似国际象棋的棋盘。该板由图片框网格组成。为了对电路板建模,我保留了一个 "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 的二维(行、列)数组,并将来自每个 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 拥有该图片框控件。目前,在图片框的共享点击处理程序中,我正在解析发件人对象的名称以获取 uxSquares 索引。

这似乎是一个粗暴的 hack,将数组索引保留在控件的名称中。然而,我的替代方案似乎是保持一个单独的查找 table 将图片框控件映射到 uxSquare,这似乎是一个同样令人震惊的 hack。

在创建时无法在子对象中设置数据时,是否有一种标准模式来识别复合对象中子对象的父对象?如果我拥有子对象,我会将父对象传递给它的构造函数并保存它。但是,我没有对 Picture Box 控件的这种访问权限。

您可以子类化图片框并将行和列索引传递给构造函数。

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; }        

}

这样,当点击事件运行时,您可以将发件人转换为 UxPicBox,并获得找到 UxSquare 所需的内容。

编辑:这是点击事件的例子

void UxPicBox_Click(object sender, EventArgs e) {
    UxPicBox pb = (UxPicBox)sender;
    MessageBox.Show(pb.Col.ToString() + " -- " + pb.Row.ToString());
}