如何在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
相关产品推荐
相关产品推荐

