为 ListView 添加项目添加事件处理程序

6
在C# Windows Form应用程序中,ListView控件是否有一个事件处理程序,在向列表视图项添加项目时触发?

可能是ListView Item Added Event的重复问题。 - David Hall
5个回答

13

您不需要编辑其他源代码!

好的:将ListView更改为myListView

很久以前,但我在寻找一种不需要实现自己的ItemAdd函数的解决方案!最好的方法是使用WndProc函数。

消息:LVM_INSERTITEM

http://msdn.microsoft.com/en-us/library/windows/desktop/bb761107%28v=vs.85%29.aspx

//COMMCTRL.H
#define LVM_FIRST               0x1000           // ListView messages
#define LVM_INSERTITEMA         (LVM_FIRST + 7)  
#define LVM_INSERTITEMW         (LVM_FIRST + 77) 
//edit itemremove (LVM_DELETEITEM)
#define LVM_DELETEITEM          (LVM_FIRST + 8)

C# 实现

class myListView : ListView {

    protected override void WndProc(ref Message m){
        base.WndProc(ref m);

        switch (m.Msg){
            case 0x1007:    //ListViewItemAdd-A
                System.Diagnostics.Debug.WriteLine("Item added (A)");
                break;
            case 0x104D:    //ListViewItemAdd-W
                System.Diagnostics.Debug.WriteLine("Item added (W)");
                break;
            //edit for itemremove
            case 0x1008:
                System.Diagnostics.Debug.WriteLine("Item removed");
                break;
            case 0x1009:
                System.Diagnostics.Debug.WriteLine("Item removed (All)");
                break;
            default:
                break;
        }
    }
}

现在你可以触发自己的ItemAddedEvent。我希望这能帮助其他遇到同样问题的人。

祝好 raiserle

(编辑:请投票 ;) )


1
谢谢分享这个信息,我可以问一下删除项目的消息或原因是什么吗? - NetInfo
2
请查看我的帖子 :D - raiserle
3
给未来的探险者留言... "所有物品已移除" 这个特定信息对应的值是 0x1009 ;) - Ian

5

没有能够做到这件事的事件。 但是您可以随时创建自己的列表框:

public class MyListView : ListView
{
    public void AddItem(ListViewItem item)
    {
        Items.Add(item);
        if (ItemAdded != null)
            ItemAdded.Invoke(this, new ItemsAddedArgs(item));
    }

    public EventHandler<ItemsAddedArgs> ItemAdded;
}

public class ItemsAddedArgs : EventArgs
{
    public ItemsAddedArgs(ListViewItem item)
    {
        Item = item;
    }

    public object Item { get; set; }
}

5

我希望你能看看这里或者这里。它们的答案基本相同,只是用了不同的风格进行阐述。简单来说,需要将ItemAdded事件添加到ListViewItemCollection中。


1
另一种选择是将项目保存在ObservableCollection类的实例中,将ListView.ItemsSource设置为该集合并订阅ObservableCollection.CollectionChanged事件。

1
遗憾的是,Forms ListView 没有 ItemsSource。这是 WPF 的改进。 - Jesse Chisholm

0

该框架定义像ItemAdded这样的事件。但是,请务必访问此解决方法:观察者模式和扩展的ListView事件模型。例如,下面的事件在那里被定义:

public event ListViewItemDelegate ItemAdded; 
public event ListViewItemRangeDelegate ItemRangeAdded; 
public event ListViewRemoveDelegate ItemRemoved; 
public event ListViewRemoveAtDelegate ItemRemovedAt;

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