VB.NET WinForm中获取动态创建GridView聚焦行OrderNo值的方法
解决VB.NET WinForm动态创建DevExpress GridControl右键获取聚焦行OrderNo的问题
核心误区纠正
运行时动态创建的GridView完全可以绑定事件,别被“无法使用事件”的想法限制。下面提供两种直接可行的实现方案:
方案一:上下文菜单关联对应GridView(Tag存储法)
在动态创建上下文菜单时,把当前GridView存入菜单的Tag属性,右键点击菜单项时直接从Tag取出GridView,再提取聚焦行的OrderNo。
代码示例
' 动态创建GridControl和GridView的逻辑示例 For Each dayData In dailyDataList Dim gridCtrl As New GridControl() gridCtrl.Name = $"Grid_{dayData.Date:yyyyMMdd}" gridCtrl.Dock = DockStyle.Fill Dim gridView As New GridView(gridCtrl) gridView.Name = $"GridView_{dayData.Date:yyyyMMdd}" ' 绑定数据源 gridCtrl.DataSource = dayData.OrderList ' 配置列 gridView.Columns.Add("OrderNo").Caption = "订单号" gridView.Columns.Add("Items").Caption = "商品" gridView.Columns.Add("Notes").Caption = "备注" ' 创建上下文菜单 Dim popupMenu As New PopupMenu() Dim menuItem As New BarButtonItem() menuItem.Caption = "查看订单详情" ' 将当前GridView存入菜单Tag popupMenu.Tag = gridView ' 绑定菜单项点击事件 AddHandler menuItem.ItemClick, AddressOf MenuItem_ItemClick popupMenu.ItemLinks.Add(menuItem) ' 给GridControl绑定上下文菜单 gridCtrl.MenuManager = popupMenu.Manager gridCtrl.ContextMenuStrip = popupMenu ' 把GridControl添加到Panel Panel1.Controls.Add(gridCtrl) Next ' 菜单项点击事件处理 Private Sub MenuItem_ItemClick(sender As Object, e As ItemClickEventArgs) ' 从菜单Tag取出对应的GridView Dim gridView As GridView = TryCast(CType(sender, BarButtonItem).Link.Menu.Tag, GridView) If gridView IsNot Nothing AndAlso gridView.FocusedRowHandle >= 0 Then ' 获取聚焦行的OrderNo值 Dim orderNo As Object = gridView.GetRowCellValue(gridView.FocusedRowHandle, "OrderNo") If orderNo IsNot Nothing Then MessageBox.Show($"当前选中订单号:{orderNo.ToString()}") ' 这里添加你的业务逻辑 End If End If End Sub
方案二:利用GridView的PopupMenuShowing事件
动态创建GridView时,直接绑定PopupMenuShowing事件,在菜单弹出前就获取聚焦行的OrderNo,可提前存入菜单Tag或直接处理逻辑。
代码示例
' 动态创建GridView时绑定事件 For Each dayData In dailyDataList ' ... 前面创建GridControl、配置列的代码和方案一一致 ... ' 绑定GridView的PopupMenuShowing事件 AddHandler gridView.PopupMenuShowing, AddressOf GridView_PopupMenuShowing ' ... 将GridControl添加到Panel的代码 ... Next ' PopupMenuShowing事件处理 Private Sub GridView_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs) Dim gridView As GridView = TryCast(sender, GridView) If gridView IsNot Nothing AndAlso gridView.FocusedRowHandle >= 0 Then ' 获取当前聚焦行的OrderNo Dim orderNo As Object = gridView.GetRowCellValue(gridView.FocusedRowHandle, "OrderNo") If orderNo IsNot Nothing Then ' 把OrderNo存入菜单Tag,方便后续菜单项使用 e.Menu.Tag = orderNo End If End If End Sub ' 菜单项点击事件中直接取Tag里的OrderNo Private Sub MenuItem_ItemClick(sender As Object, e As ItemClickEventArgs) Dim orderNo As Object = CType(sender, BarButtonItem).Link.Menu.Tag If orderNo IsNot Nothing Then MessageBox.Show($"当前选中订单号:{orderNo.ToString()}") End If End Sub
关键注意点
- 必须判断
FocusedRowHandle >= 0:排除空网格或未选中行就右键的情况 GetRowCellValue的列名要和数据源字段名完全匹配,也可改用列的FieldName属性- 如果绑定的是DataTable,也可以通过整行数据提取OrderNo:
Dim row As DataRowView = TryCast(gridView.GetFocusedRow(), DataRowView) If row IsNot Nothing Then Dim orderNo As String = row("OrderNo").ToString() End If
内容的提问来源于stack exchange,提问作者Glen Richmond
相关产品推荐
相关产品推荐

