如何将事件处理程序移动到父窗体并传递事件参数

How to move event handler to a parent form and pass eventargs

在表格 2 中,我有一个填充了数据库搜索结果的数据网格视图。

我的目标是当单击 datagridview 中的单元格时,它通过将单击的行的索引和记录集传递给表单 1 代码中的函数来填充表单 1 上文本框的内容。

在表格 1 中,我有以下内容:

 rs = New ADODB.Recordset
 rs .CursorLocation = ADODB.CursorLocationEnum.adUseClient
 rs.Open("Exec " & class_Stored_Procedures.cs_spMyO_KontaktPersonen_SEA$ & " " & SQL$, gConnectionString$, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
 Dim f = New ChildForm()
 f.Show()
 f.Focus()
 f.getAdoRecords(rs)
 '
 'This is the part in question
 AddHandler f.DataGridView1_CellClick, FillForm1(rs, (index of the row clicked))

还有...

Private Function FillForm1(rs As ADODB.RecordSet, i As Integer)
    'fill textboxes with record i values of the recordset
End Function

形式 2

使用自定义数据引发事件的最简单方法是声明并引发自定义事件。这个新事件可以在 DataGridView_CellClick 事件处理程序中触发。以这种方式与 DataGridView 分离将有助于隔离和隔离任何未来的更改。

SelectedValueEventArgs class 创建此 class 以保存要传递给父表单的事件信息,在您的情况下,Form1

Public Class SelectedValueEventArgs
    Inherits EventArgs
    Public Sub New(rs As ADODB.RecordSet, i As Integer)
        RecordSet = rs
        Index = i
    End Sub

    Public Property RecordSet As ADODB.RecordSet
    Public Property Index As Integer
End Class

声明 SelectedValueChanged 事件

使用适当的名称声明您要发起的事件。我选择了 SelectedValueChanged。此事件应在您的 Form2 class

中声明
Public Event SelectedValueChanged As EventHandler(Of SelectedValueEventArgs)

引发事件

在 DataGridView 的 _CellClick 事件处理程序中,设置事件参数并引发新事件

Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    Dim rs As ADODB.RecordSet = ' Set your ADOBB.RecordSet here
    Dim i As Integer = e.RowIndex
    Dim eventArgs As New SelectedValueEventArgs(rs, i)
    OnSelectedValueChanged(eventArgs)
End Sub

' This function will do the hard work of raising the event to parent forms
Protected Overridable Sub OnSelectedValueChanged(e As SelectedValueEventArgs)
    RaiseEvent SelectedValueChanged(Me, e)
End Sub

在您的家长表格中处理事件

最后,在您的父表单 (Form1) 中,当您显示 Form2 时,为新 created/published 添加一个处理程序事件,然后在事件处理程序中执行所需的操作 (form2_SelectedValueChanged)

Private Sub btnButton1_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
    Dim f As New Form2
    AddHandler f.SelectedValueChanged, AddressOf form2_SelectedValueChanged
    f.Show()
End Sub

Private Sub form2_SelectedValueChanged(sender As Object, e As SelectedValueEventArgs)
    Debug.Print(e.Index)
End Sub