ListView ItemSelectionChanged的触发频率高于预期

时间:2016-10-11 15:50:36

标签: winforms listview c++-cli

这与归结为“取消选择”和“选择”事件的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
            }
        }
    }
}

当我在表单中进行更改后单击某个项目时,我收到了很多调试消息,清楚地向我显示了以下事件:

  1. handleSelectionChange进入(并退出)并取消选择“脏”项
  2. handleSelectionChange输入所选项目
  3. 出现MessageBox,然后点击“取消”
  4. handleSelectionChange进入(并退出)取消选中所点击的项目
  5. handleSelectionChange选择“脏”项
  6. 进入

    ...然后它变得有趣:

    1. handleSelectionChange进入(并退出),再次取消选择“脏”项
    2. handleSelectionChange输入所选项目
    3. 出现MessageBox,然后再次点击“取消”
    4. handleSelectionChange进入(并退出)并取消选中已点击的商品
    5. handleSelectionChange再次选择“脏”项进入
    6. 然后一切都安定下来,ListView会显示之前选择的项目(“脏”项目)。

      更奇怪的是,如果我在代理中的任何地方都有断点,则不会发生问题(仅发生事件1-5)。

      我甚至尝试过使用BeginInvoke更改选择,以便在委托退出后发生程序选择更改,但没有用。行为仍然是一样的。如果我删除了MessageBox并且只是让代码采用“取消”路径,那么该行为包括所有内容(包括)步骤6,并且最终没有选择任何内容。所以它并不完全是MessageBox的错,尽管这会影响行为。

      为什么会这样?为什么在第5步之后事件顺序不会停止?附加的ItemSelectionChanged事件来自哪里?

0 个答案:

没有答案