按钮数组 - 一个事件处理程序 - 确定单击哪个按钮

时间:2013-05-08 20:37:55

标签: arrays c++-cli

我没有简单的方法来解释这个,但我有100个按钮,写在一个按钮数组中,这里有代码行:

static array <Button^, 2>^ button = gcnew array <Button^, 2> (10,10);

每个人都是在这件诉讼之后初始化的:

button[4,0] = button40;

我还为所有这些按钮都有一个事件处理程序。我需要知道的是我可以确定单击哪个按钮的方法,例如,如果单击第三行和第四列中的按钮,它应该知道名为button23的按钮(保存在数组中作为按钮[2, 3])已被按下。

另外一件事,这是C ++ / CLI,我知道这段代码有多奇怪。

1 个答案:

答案 0 :(得分:1)

在您的事件处理程序中,您拥有事件的sender

void button_Click(Object^ sender, EventArgs^ e)
{
    // This is the name of the button
    String^ buttonName = safe_cast<Button^>(sender)->Name;
}

如果需要项目索引(行和列),则需要循环遍历数组,因为Array::IndexOf不支持多维数组。让我们(在某处)写一个像这样的通用函数:

static void Somewhere::IndexOf(Array^ matrix, Object^ element, int% row, int% column)
{
    row = column = -1;

    for (int i=matrix->GetLowerBound(0); i <= matrix->GetUpperBound(0); ++i)
    {
        for (int i=matrix->GetLowerBound(1); i <= matrix->GetUpperBound(1); ++i)
        {
            // Note reference comparison, this won't work with boxed value types
            if (Object::ReferenceEquals(matrix->GetValue(i, j), element)
            {
                row = i;
                column = j;

                return;
            }
        }
    }
}

所以最后你可能有这个:

void button_Click(Object^ sender, EventArgs^ e)
{
    // This is the name of the button
    String^ buttonName = safe_cast<Button^>(sender)->Name;

    // This is the "location" of the button
    int row = 0, column = 0;
    Somewhere::IndexOf(button, sender, row, column);
}