如何解决防止绕过 ComboBox 中的 SelectedIndexChanged
我很惊讶,可以通过将显示的值更改为另一个来绕过 SelectedindexChanged
上的 ComboBox
和 ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
。
以下是重现案例的步骤:
- 创建一个带有
Form
的ComboBox
,带有ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
和一些其他控件,可以获得焦点(例如TextBox
) - 为
ComboBox.SelectedindexChanged
附加一个事件处理程序并让 假设将ComboBox
的选定索引始终重置为 0 只能选择第一个条目。 - 用例如填充
ComboBox.Items
1 到 5 的整数。 - 启动应用程序并打开下拉列表
- 单击除第一个以外的任何条目并按住鼠标左键(没有 LMBUp 必须触发)
- 按住鼠标左键按下
TAB
键 - 点击的值显示在
ComboBox
中,没有ComboBox.SelectedindexChanged
被触发。
为了防止这种不良行为,您有什么提议? Tab
键不得被抑制,ComboBox.SelectedindexChanged
必须在更改时触发。
复制粘贴的一些代码:
public Form1()
{
InitializeComponent();
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox1.Items.Add(1);
comboBox1.Items.Add(2);
comboBox1.Items.Add(3);
comboBox1.Items.Add(4);
comboBox1.Items.Add(5);
comboBox1.SelectedindexChanged += ComboBox1_SelectedindexChanged;
}
private void ComboBox1_SelectedindexChanged(object sender,EventArgs e)
{
comboBox1.Selectedindex = 0;
}
解决方法
我已经用派生控件解决了这个问题:
class ModifiedComboBox : ComboBox
{
private object _lastSelectedItem = null;
protected override void OnDropDownClosed(EventArgs e)
{
if(SelectedItem != _lastSelectedItem)
{
OnSelectedIndexChanged(new EventArgs());
}
base.OnDropDownClosed(e);
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
_lastSelectedItem = SelectedItem;
base.OnSelectedIndexChanged(e);
}
}
,
不清楚“为什么”您希望 ComboBox
出现这种奇怪的行为;但是,您似乎没有仔细观察 ComboBox
事件。
您所描述的确实如此......当用户“同时”在组合框中的选择上按住鼠标按钮时按下 Tab 键......那么 ComboBoxes
SelectedIndexChanged
事件不会触发,因为控件仍在“选择”不同索引的过程中。
但是,ComboBoxes
Validating
和 Leave
事件确实会在上述情况下触发。而不是为此创建另一个控件,连接组合框 Validating
或 Leave
事件将解决您所描述的问题。像……
正常情况下的当前 SelectedIndexChanged
...
private void comboBox1_SelectedIndexChanged(object sender,EventArgs e) {
comboBox1.SelectedIndexChanged -= new System.EventHandler(comboBox1_SelectedIndexChanged);
comboBox1.SelectedIndex = 0;
comboBox1.SelectedIndexChanged += new System.EventHandler(comboBox1_SelectedIndexChanged);
}
然后,将 ComboBoxes
Leave
事件用于“特殊”情况,即用户跳出组合框时的选项卡。
private void comboBox1_Leave(object sender,EventArgs e) {
comboBox1.SelectedIndexChanged -= new System.EventHandler(comboBox1_SelectedIndexChanged);
comboBox1.SelectedIndex = 0;
comboBox1.SelectedIndexChanged += new System.EventHandler(comboBox1_SelectedIndexChanged);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。