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

Winform VB.NET DataGridViewTextBoxCell获取最新选中位置与长度问题

Winform DataGridViewTextBoxCell获取最新SelectionStart/SelectionLength的解决方案

问题核心是原有代码仅在编辑控件初始化时获取一次选中状态,后续用户调整选中位置/长度的操作没有被捕获,导致保存的数值始终滞后。以下是修正方案:


修正步骤及代码

  1. 给编辑控件绑定SelectionChanged事件,实时捕获选中状态变化
  2. 避免重复绑定事件,每次显示编辑控件时先移除旧绑定再添加新绑定
  3. 可选:点击按钮时直接从当前活跃的编辑控件读取最新值,不依赖全局变量

修改EditingControlShowing事件处理:

Private Sub oParams_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles oParams.EditingControlShowing
    If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
        Dim tbec As DataGridViewTextBoxEditingControl = CType(e.Control, DataGridViewTextBoxEditingControl)
        
        ' 移除已绑定的事件,防止重复触发
        RemoveHandler tbec.SelectionChanged, AddressOf TextBoxSelectionChanged
        ' 绑定SelectionChanged事件,实时更新选中状态
        AddHandler tbec.SelectionChanged, AddressOf TextBoxSelectionChanged
        
        ' 初始化当前选中值
        selCellSt = tbec.SelectionStart
        selCellLen = tbec.SelectionLength
    End If
End Sub

' 新增事件处理方法,实时更新选中变量
Private Sub TextBoxSelectionChanged(sender As Object, e As EventArgs)
    Dim tbec As DataGridViewTextBoxEditingControl = CType(sender, DataGridViewTextBoxEditingControl)
    selCellSt = tbec.SelectionStart
    selCellLen = tbec.SelectionLength
End Sub

优化CellContentClick事件处理(可选更稳妥的方式):

Private Sub oParams_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles oParams.CellContentClick
    If e.ColumnIndex = 4 Then
        ' 直接从当前活跃的编辑控件读取最新值,无需依赖全局变量
        Dim activeControl = oParams.EditingControl
        If TypeOf activeControl Is DataGridViewTextBoxEditingControl Then
            Dim tbec = CType(activeControl, DataGridViewTextBoxEditingControl)
            MsgBox("sel start:  " & tbec.SelectionStart & vbNewLine & "sel lenght:  " & tbec.SelectionLength)
        Else
            MsgBox("sel start:  " & selCellSt & vbNewLine & "sel lenght:  " & selCellLen)
        End If
    End If
End Sub

原理说明

通过SelectionChanged事件,每次用户在文本框中调整选中位置或长度时,都会立即触发事件并更新保存的数值,确保点击按钮时获取的是最新状态。同时直接读取活跃编辑控件的方式,能完全避免全局变量可能带来的同步问题。

内容的提问来源于stack exchange,提问作者Loïc Van Wetter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:11:03