这与归结为“取消选择”和“选择”事件的this question不同。我看到的不是每次选择更改两次火灾,而是四次。简化代码:
System::Void myclass::handleSelectionChange(Object ^ sender, ListViewItemSelectionChangedEventArgs ^ args) {
if(myListView->SelectedIndices->Count == 1) { // This also serves to filter out "deselect" events (MultiSelect = false)
if(myUnsavedChanges && myListView->SelectedIndices[0] != myPreviousSelection) { // No need for this bit if the newly-selected item is the "dirty" item
Windows::Forms::DialogResult response = MessageBox::Show("Save your changes?", "Unsaved changes", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Warning);
if(response == Windows::Forms::DialogResult::Cancel) {
// re-select the edited item
myListView->SelectedIndices->Clear();
myListView->SelectedIndices->Add(myPreviousSelection);
} else if(response == Windows::Forms::DialogResult::Yes) {
// save the changes, don't reselect the edited item
} else if(response == Windows::Forms::DialogResult::No) {
// let the changes be lost
}
}
}
}
当我在表单中进行更改后单击某个项目时,我收到了很多调试消息,清楚地向我显示了以下事件:
handleSelectionChange
进入(并退出)并取消选择“脏”项handleSelectionChange
输入所选项目MessageBox
,然后点击“取消”handleSelectionChange
进入(并退出)取消选中所点击的项目handleSelectionChange
选择“脏”项...然后它变得有趣:
handleSelectionChange
进入(并退出),再次取消选择“脏”项 handleSelectionChange
输入所选项目 MessageBox
,然后再次点击“取消” handleSelectionChange
进入(并退出)并取消选中已点击的商品 handleSelectionChange
再次选择“脏”项进入 然后一切都安定下来,ListView会显示之前选择的项目(“脏”项目)。
更奇怪的是,如果我在代理中的任何地方都有断点,则不会发生问题(仅发生事件1-5)。
我甚至尝试过使用BeginInvoke更改选择,以便在委托退出后发生程序选择更改,但没有用。行为仍然是一样的。如果我删除了MessageBox并且只是让代码采用“取消”路径,那么该行为包括所有内容(包括)步骤6,并且最终没有选择任何内容。所以它并不完全是MessageBox的错,尽管这会影响行为。
为什么会这样?为什么在第5步之后事件顺序不会停止?附加的ItemSelectionChanged事件来自哪里?