Listview的ItemSelectionChanged事件会触发两次?

11
我有一个C# Winforms应用程序,其中包含一个ListView控件。这个ListView显示了待办事项列表,并使用“ItemSelectionChanged”事件处理更新。问题在于每次我试图进行更新时,“ItemSelectionChanged”事件都会触发两次。
该事件会刷新表单以表示更新(例如从列表中删除项目)。是否有一种方法可以在刷新后禁用事件触发? UPDATE1:
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {   
        if (e.IsSelected)
        {                
            listView1.Items[e.ItemIndex].Remove();

            listView1.SelectedIndices.Clear();
            listView1.Focus();

            listView1.Update();
        }
        else
        {

        }

    }
4个回答

19

是的,它会触发两次。一次是因为先前选定的项目变为未选定状态,另一次是为了新选择的项目。您只需要确保看到选择事件:

    private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
        if (e.IsSelected) {
            // Update form
            //...
        }
    }

1
谢谢,但是IsSelected对我没有起作用。我的代码肯定还有其他问题,导致它触发两次。 - John M
2
不,它肯定会触发两次。这是出于设计考虑。重点是要检测您感兴趣的那一个。从您的问题中并不太清楚。 - Hans Passant

0

我认为您需要在处理程序的末尾手动取消选择该项。

listView1.SelectedItem = null;


-1

试试这个:

private void ItemSelect()
{

        if(SelectedItem!=null)
            App.Current.MainPage.Navigation.PushAsync(new Pages.TLAccByCurrency(), true);
        _selectedItem = null;
}

-1

是的,只需在刷新开始时删除EventHandler,然后在刷新完成后再添加它即可。

i.e

// Remove handler
listView1.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(listView1_ItemSelectionChanged);

// Do refresh

// Add again
listView1.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(listView1_ItemSelectionChanged);

1
不,你只需要用你的 ListViewControl 的名字替换 ListView,例如 ListView1,而 MethodName 应该是当 OnSelectionChanged 事件被触发时调用的函数的名称,例如 ListView1_OnSelectionChanged,其中 ListView1 再次是你的 ListViewControl 的名称。 - Iain Ward
1
我稍微有点偏差,我已经更新了示例以使其更清晰。您只需要用您的listview名称替换listView1,对于listView1_ItemSelectionChanged也是一样。如果您遇到困难,请告诉我。 - Iain Ward
Collection -= new thing 如何从集合中删除任何内容?您要求集合删除从未添加到其中的内容。 - Brian A. Henning
1
@Lotharyx 它并不是一个集合,而是一个事件处理程序。它被移除是为了在更新时停止事件触发,然后在之后再将其添加回来。 - Iain Ward
1
@w69rdy 事件处理程序一个委托集合。我知道删除委托的作用;我的意思是,你的示例代码不会删除任何东西,因为你正在删除从未添加过的“new”委托实例。 - Brian A. Henning
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接