Winform VB.NET DataGridViewTextBoxCell获取最新选中位置与长度问题
Winform DataGridViewTextBoxCell获取最新SelectionStart/SelectionLength的解决方案
问题核心是原有代码仅在编辑控件初始化时获取一次选中状态,后续用户调整选中位置/长度的操作没有被捕获,导致保存的数值始终滞后。以下是修正方案:
修正步骤及代码
- 给编辑控件绑定
SelectionChanged事件,实时捕获选中状态变化 - 避免重复绑定事件,每次显示编辑控件时先移除旧绑定再添加新绑定
- 可选:点击按钮时直接从当前活跃的编辑控件读取最新值,不依赖全局变量
修改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
相关产品推荐
相关产品推荐

