C# 如何在启用-禁用状态下遍历三个与选择相关的组合框

C# 如何在启用-禁用状态下遍历三个与选择相关的组合框,c#,winforms,combobox,C#,Winforms,Combobox,我花了很多时间试图解决这个问题。 我有3个组合框,我试图在加载表单时激活第一个组合框,其余组合框处于非活动状态。 当在第一个cmb中选择值(双重类型)时,第二个激活,第一个变为非活动状态,然后在第二个cmb中选择值,第一个保持非活动状态,第二个变为非活动状态,从第三个组合框中选择值后激活第三个cmb,第一个变为活动状态,其余变为非活动状态,直到再次开始选择 这在WINDOWS窗体上 我尝试使用循环,但很快变得非常复杂:-( 我希望这足够清楚:——) 谢谢您需要使用事件,如SelectionCha

我花了很多时间试图解决这个问题。 我有3个组合框,我试图在加载表单时激活第一个组合框,其余组合框处于非活动状态。 当在第一个cmb中选择值(双重类型)时,第二个激活,第一个变为非活动状态,然后在第二个cmb中选择值,第一个保持非活动状态,第二个变为非活动状态,从第三个组合框中选择值后激活第三个cmb,第一个变为活动状态,其余变为非活动状态,直到再次开始选择

这在WINDOWS窗体上

我尝试使用循环,但很快变得非常复杂:-( 我希望这足够清楚:——)


谢谢

您需要使用事件,如SelectionChangeCommitted。事件处理程序用于在满足某些条件时自动调用方法,因此允许您执行某些条件操作,而无需使用循环进行轮询。下面是一个示例,它应该满足您的需求,尽管它会使gui变得有些不友好

public partial class ExampleForm : Form
{
    public ExampleForm()
    {
        InitializeComponent();

        comboBox1.Enabled = true;
        comboBox2.Enabled = false;
        comboBox3.Enabled = false;

        comboBox1.Items.Add("option1");
        comboBox1.Items.Add("option2");

        comboBox2.Items.Add("option1");
        comboBox2.Items.Add("option2");

        comboBox3.Items.Add("option1");
        comboBox3.Items.Add("option2");

        comboBox1.OnSelectedIndexChanged += comboBox1_OnSelectedIndexChanged;
        comboBox2.OnSelectedIndexChanged += comboBox2_OnSelectedIndexChanged;
        comboBox3.OnSelectedIndexChanged += comboBox3_OnSelectedIndexChanged;
    }

    void comboBox1_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        comboBox1.Enabled = false;
        comboBox2.Enabled = true;
    }

    void comboBox2_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        comboBox2.Enabled = false;
        comboBox3.Enabled = true;
    }

    void comboBox3_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        comboBox1.Enabled = true;
        comboBox3.Enabled = false;
    }
}

我将为组合框创建一个数组,并让所有3个组合框使用相同的
SelectedIndexChanged
处理程序:

// List the combo boxes in the order you want them to enable.
ComboBox[] _boxes = { comboBox1, comboBox2, comboBox3 };

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    int index = Array.IndexOf(_boxes, (ComboBox)sender);

    // Disable the combo box that just got its value selected.
    _boxes[index].Enabled = false;

    // If it's not the last combo box in the array, enable the next one.
    if(index < _boxes.Length - 1)
        _boxes[index + 1].Enabled = true;
}
//按要启用的顺序列出组合框。
ComboBox[]_-box={comboBox1,comboBox2,comboBox3};
private void组合框\u SelectedIndexChanged(对象发送方,事件参数e)
{
int index=Array.IndexOf(_框,(组合框)发送方);
//禁用刚选择其值的组合框。
_框[index].Enabled=false;
//如果它不是数组中的最后一个组合框,请启用下一个组合框。
如果(索引<方框长度-1)
_框[index+1]。Enabled=true;
}
然后,您只需设置组合框的初始状态,使第一个组合框处于启用状态,而另两个组合框处于未启用状态


这也很容易扩展。如果您决定向流中添加另一个组合框,只需将其添加到
\u框
数组中。

这是WinForms应用程序吗?将代码添加到您的问题中。是的,Windows Forms.Dynamic,在多次尝试后,我删除了代码。考虑从头开始。itsme86,我是否应该将此代码放入组合框1中的一个组合处理程序中?将数组放入
Form1
类中,而不是方法中。该方法应该是组合框的所有3个
SelectedIndexChanged
事件的事件处理程序。它们都应该使用相同的事件处理程序。很抱歉,itsme86,但我在当前代码中很难实现这一点。我已经为3个组合使用了3个事件处理程序,它们在代码的其他部分都使用。我不能对所有事件使用一个事件处理程序。这比我的c#技能更高级:-)验证为有效。如果直接将此示例复制并粘贴为一个新类,然后使用调试器逐步了解不清楚的情况下会发生什么。user2647513,InitializedComponent vs之后的最后三行代码告诉我组合框名称在当前上下文中不存在。奇怪的是,上面的所有代码都可以识别我的所有组合。谢谢您的帮助。我的组合事件处理程序是SelectedIndexChanged您的SelectedIndexChanged。您必须将组合框添加到表单中。如果使用设计器添加它们,则必须确保
Name
属性是
comboBox1
comboBox2
、和
comboBox3
@Thomas。没关系,只要将方法附加到正确对象的正确事件处理程序,就可以指定任意名称。