C# 如何仅为多个控件创建一个事件处理程序方法?

C# 如何仅为多个控件创建一个事件处理程序方法?,c#,.net,winforms,event-handling,c#-2.0,C#,.net,Winforms,Event Handling,C# 2.0,我有15个组合框,我不想为每个组合框创建一个事件处理程序。我如何只做一个过程并将所有组合框绑定到它 private void cbSlots0_SelectedIndexChanged(object sender, EventArgs e) { var item = ConfigClass.Slots["0"][cbSlots0.SelectedIndex]; ConfigClass.Slots["0"].Insert(0, item); ConfigClass.Slot

我有15个组合框,我不想为每个组合框创建一个事件处理程序。我如何只做一个过程并将所有组合框绑定到它

private void cbSlots0_SelectedIndexChanged(object sender, EventArgs e)
{
    var item = ConfigClass.Slots["0"][cbSlots0.SelectedIndex];
    ConfigClass.Slots["0"].Insert(0, item);
    ConfigClass.Slots["0"].RemoveAt(cbSlots0.SelectedIndex + 1);
}

private void cbSlots1_SelectedIndexChanged(object sender, EventArgs e)
{
    var item = ConfigClass.Slots["1"][cbSlots1.SelectedIndex];
    ConfigClass.Slots["1"].Insert(1, item);
    ConfigClass.Slots["1"].RemoveAt(cbSlots1.SelectedIndex + 1);
}
正确答案:

var cb = ((ComboBox)sender);
            var tag = int.Parse(cb.Tag.ToString());
            var item = ConfigClass.Slots[tag.ToString()][cb.SelectedIndex];
            ConfigClass.Slots[tag.ToString()].Insert(tag, item);
            ConfigClass.Slots[tag.ToString()].RemoveAt(cb.SelectedIndex + 1);

这是相对简单的。创建一个
SelectedIndexChanged
事件处理程序方法,然后将其连接到所有组合框控件


在运行时区分方法内部控件的方法是检查
sender
参数的值。您必须将其强制转换为
组合框
控件,但这是安全的,因为您知道没有将任何非组合框控件连接到该事件处理程序。然后,您将能够访问引发您正在处理的事件的组合框的所有属性。

这相对简单。创建一个
SelectedIndexChanged
事件处理程序方法,然后将其连接到所有组合框控件


在运行时区分方法内部控件的方法是检查
sender
参数的值。您必须将其强制转换为
组合框
控件,但这是安全的,因为您知道没有将任何非组合框控件连接到该事件处理程序。然后,您将能够访问引发您正在处理的事件的combobox的所有属性。

您可以为每个combobox指定一个不同的属性,其中包含ConfigClass中条目的编号,然后像这样使用:

private void cbSlots0_SelectedIndexChanged(object sender, EventArgs e)
{
    int tag = (int)((ComboBox)sender).Tag;
    var item = ConfigClass.Slots[tag.ToString()][cbSlots0.SelectedIndex];
    ConfigClass.Slots[tag.ToString()].Insert(tag, item);
    ConfigClass.Slots[tag.ToString()].RemoveAt(cbSlots0.SelectedIndex + 1);
}

标记可以包含您想要的任何数据,因此,如果您需要在其中存储更复杂的数据,这也是一种可能性。

您可以为每个组合框指定一个不同的值,其中包含ConfigClass中条目的编号,然后像这样使用:

private void cbSlots0_SelectedIndexChanged(object sender, EventArgs e)
{
    int tag = (int)((ComboBox)sender).Tag;
    var item = ConfigClass.Slots[tag.ToString()][cbSlots0.SelectedIndex];
    ConfigClass.Slots[tag.ToString()].Insert(tag, item);
    ConfigClass.Slots[tag.ToString()].RemoveAt(cbSlots0.SelectedIndex + 1);
}

标记可以包含您想要的任何数据,因此如果您需要在其中存储更复杂的数据,这也是一种可能性。

我建议为所有组合框提供一个事件处理程序。之后,在事件处理程序中,使用sender引用来决定要使用的插槽:

private void allComboBoxesSelectedIndesChanged(object sender, EventArgs e)
{
    int index = 0; // Or string as you have shown in your example.

    if (sender == cbSlots0)
        index = 0;
    else if (sender == cbSlots1)       
        index = 1;
    /// And so on for any other comboBox

    var item = ConfigClass.Slots[index][((ComboBox) sender).SelectedIndex];
    ConfigClass.Slots[index].Insert(index, item);
    ConfigClass.Slots[index].RemoveAt(((ComboBox) sender).SelectedIndex +1);
}

我建议为所有组合框提供一个事件处理程序。之后,在事件处理程序中,使用sender引用来决定要使用的插槽:

private void allComboBoxesSelectedIndesChanged(object sender, EventArgs e)
{
    int index = 0; // Or string as you have shown in your example.

    if (sender == cbSlots0)
        index = 0;
    else if (sender == cbSlots1)       
        index = 1;
    /// And so on for any other comboBox

    var item = ConfigClass.Slots[index][((ComboBox) sender).SelectedIndex];
    ConfigClass.Slots[index].Insert(index, item);
    ConfigClass.Slots[index].RemoveAt(((ComboBox) sender).SelectedIndex +1);
}

将标记中的每个项目绑定到相同的SelectedIndexChangedEvent,并将发件人强制转换为您的项目。因此,在您的代码中,查找所有唯一的事件名称(即cbSlots0\u SelectedIndexChanged、cbSlots1\u SelectedIndexChanged等),并将它们重命名为单个事件名称(例如cbSlotsSelectedIndexChanged)

我认为这是正确的。核实

代码:

private void cbSlotsSelectedIndexChanged(object sender, EventArgs e)
{
    ComboBox cBox = (ComboBox) sender;
    int tag = (int)cBox.Tag;
    var item = ConfigClass.Slots[tag.ToString()][cBox.SelectedIndex];
    ConfigClass.Slots[tag.ToString()].Insert(tag, item);
    ConfigClass.Slots[tag.ToString()].RemoveAt(item.SelectedIndex + 1);
}
更新: 我根据要求修改了我的帖子

private void cbSlotsSelectedIndexChanged(object sender, EventArgs e)
{
    var cb = ((ComboBox)sender);
    var tag = int.Parse(cb.Tag.ToString());
    var item = ConfigClass.Slots[tag.ToString()][cb.SelectedIndex];
    ConfigClass.Slots[tag.ToString()].Insert(tag, item);
    ConfigClass.Slots[tag.ToString()].RemoveAt(cb.SelectedIndex + 1);
}

将标记中的每个项目绑定到相同的SelectedIndexChangedEvent,并将发件人强制转换为您的项目。因此,在您的代码中,查找所有唯一的事件名称(即cbSlots0\u SelectedIndexChanged、cbSlots1\u SelectedIndexChanged等),并将它们重命名为单个事件名称(例如cbSlotsSelectedIndexChanged)

我认为这是正确的。核实

代码:

private void cbSlotsSelectedIndexChanged(object sender, EventArgs e)
{
    ComboBox cBox = (ComboBox) sender;
    int tag = (int)cBox.Tag;
    var item = ConfigClass.Slots[tag.ToString()][cBox.SelectedIndex];
    ConfigClass.Slots[tag.ToString()].Insert(tag, item);
    ConfigClass.Slots[tag.ToString()].RemoveAt(item.SelectedIndex + 1);
}
更新: 我根据要求修改了我的帖子

private void cbSlotsSelectedIndexChanged(object sender, EventArgs e)
{
    var cb = ((ComboBox)sender);
    var tag = int.Parse(cb.Tag.ToString());
    var item = ConfigClass.Slots[tag.ToString()][cb.SelectedIndex];
    ConfigClass.Slots[tag.ToString()].Insert(tag, item);
    ConfigClass.Slots[tag.ToString()].RemoveAt(cb.SelectedIndex + 1);
}

可能重复的,可能重复的,好的,但请编辑帖子。var cb=((组合框)发送方);var tag=int.Parse(cb.tag.ToString());var item=ConfigClass.Slots[tag.ToString()][cb.SelectedIndex];ConfigClass.Slots[tag.ToString()]插入(标记,项);ConfigClass.Slots[tag.ToString()].RemoveAt(cb.SelectedIndex+1);好的,但是请编辑帖子。var cb=((组合框)发送方);var tag=int.Parse(cb.tag.ToString());var item=ConfigClass.Slots[tag.ToString()][cb.SelectedIndex];ConfigClass.Slots[tag.ToString()]插入(标记,项);ConfigClass.Slots[tag.ToString()].RemoveAt(cb.SelectedIndex+1)-1:那么大的if/否则if/。。。结构将是一个痛苦的维持。最好使用单独的事件处理程序将索引传递给共享的公共方法。(但是,在这种情况下,使用
Control.Tag
是一种有效的方法。)-1:那么大的if/else if/。。。结构将是一个痛苦的维持。最好使用单独的事件处理程序将索引传递给共享的公共方法。(但是,在这种情况下,使用
Control.Tag
是一种有效的方法。)