You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VB.NET中实现用户控件向Windows窗体传递数据

解决VB.NET模态弹窗中用户控件选中记录后传递值到父窗体的问题

现有代码中,子窗体仅在Populate方法执行时从用户控件获取一次mUniqueTransId,但用户点击网格按钮触发SelectCard更新用户控件的mUniqueTransId时,子窗体的对应属性不会同步更新,导致父窗体拿到的是初始值而非选中后的最新值。以下是修正方案:

步骤1:给用户控件添加选中事件

在用户控件中定义事件,选中记录并获取mUniqueTransId后触发事件传递值:

' 用户控件中新增事件定义
Public Event CardSelected(ByVal uniqueTransId As String)

Private Sub SelectCard(ByVal RecordIdentity As Integer)
    Try
        Dim selectedItem = (From d In mCustomerPaymentDetailsList Where d.Identity = RecordIdentity).FirstOrDefault()
        If selectedItem IsNot Nothing Then
            mUniqueTransId = selectedItem.UniqueTransId
            ' 触发事件,传递选中的UniqueTransId
            RaiseEvent CardSelected(mUniqueTransId)
        End If
    Catch ex As Exception
        Charter.UI.ApplicationBase.Utility.ShowException(mUIC, "Edit Customer Cards", ex)
    End Try
End Sub

Private Sub lgMain_CellButtonClick(ByVal cell As Infragistics.Win.UltraWinGrid.UltraGridCell, ByVal ColumnName As String) Handles lgMain.CellButtonClick
    SelectCard(lgMain.SelectedId)
End Sub

步骤2:子窗体订阅用户控件事件并更新属性

在子窗体中订阅用户控件的CardSelected事件,实时更新自身的mUniqueTransId:

Public Class CustomerCardsDlg

    Private mUIC As ApplicationInterfaces.UIContext
    Private mPaymentDetailsList As New DataTable
    Private mCustomerCallerService As CustomerCallerService
    Private mCustomerPaymentDetailsList As List(Of CustomerGravityPaymentDetailsModel)
    Private mCustomerIdentity As Integer = Integer.MinValue
    Public Property mUniqueTransId As String = String.Empty

    Public Sub New(UIC As ApplicationInterfaces.UIContext, customerIdentity As Integer)
        InitializeComponent()
        mUIC = UIC
        mCustomerIdentity = customerIdentity
        mCustomerCallerService = New CustomerCallerService(UIC.Context.ProductKey, UIC.Context.UserName)
        ' 订阅用户控件的选中事件
        AddHandler PaymentMethodsEmergePayCtrl1.CardSelected, AddressOf OnCardSelected
    End Sub

    ' 处理用户控件的选中事件,更新自身属性
    Private Sub OnCardSelected(ByVal uniqueTransId As String)
        mUniqueTransId = uniqueTransId
        ' 若需要选中后直接关闭弹窗,可添加以下代码
        ' Me.Close()
    End Sub

    Private Sub Populate()
        Try
            PaymentMethodsEmergePayCtrl1.Populate(mUIC, mPaymentDetailsList, mCustomerPaymentDetailsList)
        Catch ex As Exception
            Charter.UI.ApplicationBase.Utility.ShowException(mUIC, "Could not load.", ex)
        End Try
    End Sub

    Private Async Sub Dlg_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        PaymentMethodsEmergePayCtrl1.Focus()
        mCustomerPaymentDetailsList = Await mCustomerCallerService.GetCustomerPaymentDetailsAsync(mCustomerIdentity)
        mPaymentDetailsList = Ops.Utility.ConvertToDataTable(mCustomerPaymentDetailsList)
        Populate()
    End Sub

End Class

步骤3:父窗体获取最新值

父窗体现有代码无需修改,当子窗体关闭后,f.mUniqueTransId会返回用户最后选中的记录ID;若在子窗体的OnCardSelected方法中添加Me.Close(),则选中后弹窗直接关闭,父窗体立即拿到选中值。

内容的提问来源于stack exchange,提问作者Kamran Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:27:29