当我不控制子对象时,从子对象中识别父对象
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());
}
在创建时无法在子对象中设置数据时,是否有一种标准模式来识别复合对象中子对象的父对象?
我正在制作一个类似国际象棋的棋盘。该板由图片框网格组成。为了对电路板建模,我保留了一个 "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());
}