Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在调用方法时捕获?_.net_Vb.net_Winforms_Methods_Delegates - Fatal编程技术网

.net 在调用方法时捕获?

.net 在调用方法时捕获?,.net,vb.net,winforms,methods,delegates,.net,Vb.net,Winforms,Methods,Delegates,(首先很抱歉,因为我不知道如何正确命名这个问题。) 当我从GUI中的按钮调用此命令时,我需要执行某种操作: Listview1.Items.Add(LVItem) 问题是,我需要从其他类执行此操作,我的意思是不继承ListView来引发自己的ItemIsAdded事件等 那么这可能吗 我将举一个例子来更好地了解我: 我有Form1课程: Public Class Form1 Public WithEvents _undoManager As UndoManager Private Sub

(首先很抱歉,因为我不知道如何正确命名这个问题。)

当我从GUI中的按钮调用此命令时,我需要执行某种操作:

Listview1.Items.Add(LVItem)
问题是,我需要从其他类执行此操作,我的意思是不继承ListView来引发自己的
ItemIsAdded
事件等

那么这可能吗

我将举一个例子来更好地了解我:

我有
Form1
课程:

Public Class Form1

Public WithEvents _undoManager As UndoManager

Private Sub Form1_Load(sender As Object, e As EventArgs) _
Handles MyBase.Load

    _undoManager = New UndoManager(Listview1)

End Sub

Private Sub Button_AddItem_Click(sender As Object, e As EventArgs) _
Handles Button_AddItem.Click

    Listview1.Items.Add(LVItem)

End Sub

End Class
UndoManager
类:

Public Class UndoManager

    Delegate Sub AddDelegate(item As ListViewItem)

    Private Shared LV As ListView

    Private Shared ListView_Add_Method = New AddDelegate(AddressOf LV.Items.Add)

    Public Sub New(ByVal ListView As ListView)
        LV = ListView
    End Sub


    ' Here code to capture when the delegate method is called...

    private sub blahblahblah() handles ListView_Add_Method.IsCalled
      ' blah blah blah
    end sub    

End Class

然后,当我调用
Form1
类中的
Listview1.Items.Add(LVItem)
以执行某种操作,然后添加项时,
UndoManager
类需要捕获(如果调用
Items.Add()
方法之前或之后运行该操作,则实际上没有数学).

您已经有了一个
ItemAdded
事件-您缺少的是Undo Manager监视这些事件的方法。一种方法是在类中添加一个hander,该类将监视该事件。例如,对于文本观察者:

Friend Overrides Function Watcher(ByVal ctl As Control) As Boolean

    ' can also be ComboBox, DateTimePicker etc
    If TypeOf Ctl is TextBox Then
          AddHandler ctl.Enter, AddressOf _Enter
          AddHandler ctl.Leave, AddressOf _Leave
            Return True

        Case Else
            Return False

    End Select

End Function
_enter获取BeforeText\u leave将其与现在的文本进行比较。如果有更改,则开始执行撤消操作。在您的情况下,只需监视ctl.ItemAdded和ctl.ItemRemoved即可生成事件(无需比较)。只要稍微聪明一点,您就应该能够根据正在观看的事件轻松创建项、标记和检查撤消操作

观察者(其他UndoManager称之为
监视器
)是创建撤消操作的观察者:

Private Sub _Leave(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim NewText As String = CType(sender, Control).Text

    If _Text <> NewText Then
        MyBase.OnNewAction(sender, _ 
           New AddActionArgs(UndoManager.UnDoReDo.UnDo, _
           New TextUndo(sender, _Text)))
    End If
End Sub
Private Sub\u Leave(ByVal sender作为System.Object,ByVal e作为System.EventArgs)
Dim NewText As String=CType(发送方,控件)。文本
如果_textnewtext那么
MyBase.OnNewAction(发送方,\u
新的AddActionArgs(UndoManager.UnDoReDo.UnDo_
新文本撤消(发送方,_Text)))
如果结束
端接头

最简单的方法可能是每次添加项目时在undomanager中专门触发事件。让它自动发生可能意味着创建您自己的继承类并添加您想要的功能。