8

我希望这个名字能解决我的问题……所以,我刚开始制作一个记忆游戏,我用 25 个复选框按钮来显示这些项目。

我想知道如果每个按钮使用相同的事件处理程序,是否有办法从 EventArgs 或 Object 中判断它是从哪个按钮发送的。

private void checkBox_CheckedChanged(object sender, EventArgs e)
    {
        checkBox = Code which will determine what checkBox sent it.
        if (checkBox.Checked)
        { Box.ChangeState(checkBox, true); }
        else { Box.ChangeState(checkBox, false);}
    }
4

2 回答 2

17

在定义它们时尝试设置Name每个复选框的属性,然后使用((CheckBox)sender).Name来识别每个单独的复选框。

定义时间:

CheckBox chbx1 = new CheckBox();
chbx1.Name = "chbx1";
chbx1.CheckedChanged += checkBox_CheckedChanged;
CheckBox chbx2 = new CheckBox();
chbx2.Name = "chbx2";
chbx2.CheckedChanged += checkBox_CheckedChanged;
CheckBox chbx3 = new CheckBox();
chbx3.Name = "chbx2";
chbx3.CheckedChanged += checkBox_CheckedChanged;

private void checkBox_CheckedChanged(object sender, EventArgs e)
    {
        string chbxName = ((CheckBox)sender).Name;
        //Necessary code for identifying the CheckBox and following processes ...
        checkBox = Code which will determine what checkBox sent it.
        if (checkBox.Checked)
        { Box.ChangeState(checkBox, true); }
        else { Box.ChangeState(checkBox, false);}
    }
于 2013-11-30T05:37:42.607 回答
5

sender 对象实际上是启动事件的控件,您可以将其转换为正确的类型以访问其所有属性。您可以Name按照说明使用,或者像我有时那样使用该Tag属性。但在这种情况下,只需将 sender 转换为 CheckBox 就可以了。

private void checkBox_CheckedChanged(object sender, EventArgs e)
{
    CheckBox cb = (CheckBox)sender;
    if (cb.Checked)
    { Box.ChangeState(cb, true); }
    else { Box.ChangeState(cb, false); }
}
于 2013-11-30T05:59:15.420 回答