C# 如何在启用-禁用状态下遍历三个与选择相关的组合框
我花了很多时间试图解决这个问题。 我有3个组合框,我试图在加载表单时激活第一个组合框,其余组合框处于非活动状态。 当在第一个cmb中选择值(双重类型)时,第二个激活,第一个变为非活动状态,然后在第二个cmb中选择值,第一个保持非活动状态,第二个变为非活动状态,从第三个组合框中选择值后激活第三个cmb,第一个变为活动状态,其余变为非活动状态,直到再次开始选择 这在WINDOWS窗体上 我尝试使用循环,但很快变得非常复杂:-( 我希望这足够清楚:——)C# 如何在启用-禁用状态下遍历三个与选择相关的组合框,c#,winforms,combobox,C#,Winforms,Combobox,我花了很多时间试图解决这个问题。 我有3个组合框,我试图在加载表单时激活第一个组合框,其余组合框处于非活动状态。 当在第一个cmb中选择值(双重类型)时,第二个激活,第一个变为非活动状态,然后在第二个cmb中选择值,第一个保持非活动状态,第二个变为非活动状态,从第三个组合框中选择值后激活第三个cmb,第一个变为活动状态,其余变为非活动状态,直到再次开始选择 这在WINDOWS窗体上 我尝试使用循环,但很快变得非常复杂:-( 我希望这足够清楚:——) 谢谢您需要使用事件,如SelectionCha
谢谢您需要使用事件,如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。没关系,只要将方法附加到正确对象的正确事件处理程序,就可以指定任意名称。