【发布时间】:2017-05-17 22:48:15
【问题描述】:
我们得到一个从 Microsoft Visual Studio 的模板(PasteBin 上的设计器代码1234)创建的 Windows 窗体应用程序,默认列表框exampleListBox 和按钮exampleButton。
我们用 1 到 10 的数字填充 ListBox。
for (int i = 0; i < 10; ++i)
{
exampleListBox.Items.Add(i);
}
然后我们添加两个事件处理程序。
exampleListBox_SelectedIndexChanged 只会将当前选择的索引写入控制台。
private void exampleListBox_SelectedIndexChanged(object sender, EventArgs e)
{
Console.WriteLine(exampleListBox.SelectedIndex);
}
exampleButton_Click 会将当前选定索引处的项目设置为自身。如此有效,这应该不会改变任何事情。
private void exampleButton_Click(object sender, EventArgs e)
{
exampleListBox.Items[exampleListBox.SelectedIndex] = exampleListBox.Items[exampleListBox.SelectedIndex];
}
当按钮被点击时,我希望什么都不会发生。然而,这种情况并非如此。即使SelectedIndex 没有更改,单击该按钮也会触发exampleListBox_SelectedIndexChanged 事件。
例如,如果我单击 exampleListBox 中索引 2 处的项目,则 exampleListBox.SelectedIndex 将变为 2。如果我按 exampleButton,则 exampleListBox.SelectedIndex 仍为 2。然而,exampleListBox_SelectedIndexChanged 事件将触发.
为什么即使选定的索引没有更改,事件也会触发?
此外,有没有办法防止这种行为发生?
【问题讨论】:
-
我可能是错的,但我认为分配给列表框运行
internal void SetItemInternal(int index, object value),如果项目具有相同的string.Compare它运行此代码,请注意注释:// NEW - FOR COMPATIBILITY REASONS // Minimum compatibility fix for VSWhidbey 377287 if (selected) { owner.OnSelectedIndexChanged(EventArgs.Empty); //will fire selectedvaluechanged -
@CloseVoter 为什么这是题外话?包括期望的行为,而不是印刷错误、家庭作业帮助或建议。
-
为什么你期望什么都不会发生..你分配
SelectedIndex你应该检查SelectedIndex >= 0然后你使用调试器检查SelectedIndex值是什么? -
@MethodMan 我没有分配给
SelectedIndex本身。是的,我确实检查了SelectedIndex的值是什么。例如,如果我选择索引 2 处的项目,SelectedIndex将变为 2。然后我按下按钮,SelectedIndex仍然是 2。 -
您可以存储
lastSelectedIndex的值,每次SelectedIndexChanged触发时,将最后存储的值与当前值进行比较,以确定它是否实际更改。老实说,虽然这是一个“错误”,但我更喜欢保留这种行为。例如当项目更改时,我希望得到通知,无论所选索引是否更改。
标签: c# winforms listbox selectedindexchanged .net-4.5.2