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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 22:13:15