在我的应用程序中,我有Combobox comboBox1
订阅了活动comboBox1_SelectedIndexChanged
和comboBox1_KeyDown
。 comboBox1
有10个项目,当用户使用向下键导航到第8个项目时,我希望仅针对第8个项目引发SelectedIndexChanged
事件,而不是从第1个项目到第7个项目。
我想在这里尝试实现的是在尝试使用向下或向上键选择特定值时等待用户的选择
答案 0 :(得分:0)
每次索引更改时都会触发comboBox1_SelectedIndexChanged
事件!您可以做的是根据SelectedIndex
执行您想要的某部分代码。只有在第8项时才这样做。但是,当注册并且索引发生变化时,您无法阻止事件被触发。
当按下任何按钮向下时,实际上会触发comboBox1_KeyDown
事件,而不仅是向下键。你还可以做的是:不要注册comboBox1_SelectedIndexChanged
事件,而是编写自己的方法。然后检查comboBox1_KeyDown
事件是否按下了向下按钮以及是否现在选择了第8个项目,然后执行您的方法。
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Up|| e.KeyCode == Keys.Down) && comboBox1.SelectedIndex == 7)
{
// do something fancy
}
}
编辑:
我建议让用户在选择过程结束时按Enter
。这是一种非常直观的方法。
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
// do something fancy with comboBox1.SelectedItem
}
}
否则你也可以使用一个计时器(这将是不必要的复杂和不可靠的,用户也将不得不等待,如果他改变他的决定....我不会建议这个策略)
EDIT2:
我找到一篇关于抑制事件的帖子。所以你基本上可以强迫comboBox1_SelectedIndexChanged
事件“冻结”直到你释放它。看看this
答案 1 :(得分:0)
在事件处理程序中,您可以执行以下操作:
int index = comboBox1.FindString((String)sender);
然后你可以检查你的指数是否为8
答案 2 :(得分:0)
您可以手动调用该事件,
private void comboBox1_KeyDown(object sender, KeyEventArgs e){
if (comboBox1.SelectedIndex == 4)
{
ComboBox1_SelectedIndexChanged(comboBox1, new EventArgs());
}
}
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e){
MessageBox.Show("Test");
}
使用按下键后触发的Key_Up事件。
private void comboBox1_KeyUp(object sender, KeyEventArgs e)
{
ComboBox1_SelectedIndexChanged(comboBox1, new EventArgs());
}
或者你可以使用SelectionChangeCommitted事件,
private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
ComboBox1_SelectedIndexChanged(comboBox1, new EventArgs());
}
希望有所帮助,