C# DataGridView单元格输入保留制表符且禁止Tab跳列如何实现?
解决方案
核心逻辑
你之前的拦截逻辑只是屏蔽了Tab键的默认行为,没有主动将制表符插入到编辑内容中,所以会出现制表符丢失的问题。只需要在拦截到符合条件的Tab键时,手动向当前激活的编辑控件插入制表符即可。
实现代码
方法1:修改现有ProcessCmdKey逻辑
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // 匹配编辑状态下目标列(第4列,索引从0开始)的Tab输入 if (keyData == Keys.Tab && dGItems.EditingControl != null && msg.HWnd == dGItems.EditingControl.Handle && dGItems.SelectedCells.Cast<DataGridViewCell>().Any(x => x.ColumnIndex == 4)) { // 手动向编辑框插入制表符 var editBox = (TextBox)dGItems.EditingControl; int selectionStart = editBox.SelectionStart; editBox.Text = editBox.Text.Insert(selectionStart, "\t"); // 光标移动到插入的制表符之后 editBox.SelectionStart = selectionStart + 1; // 阻止默认Tab行为 return true; } return base.ProcessCmdKey(ref msg, keyData); }
方法2:通过EditingControlShowing事件绑定处理(无需重写窗体方法)
如果不想重写窗体的ProcessCmdKey,也可以直接给DataGridView绑定编辑控件的事件:
private void dGItems_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { // 只给第4列的编辑控件绑定事件 if (dGItems.CurrentCell.ColumnIndex == 4 && e.Control is TextBox editBox) { // 先移除之前绑定的事件避免重复绑定 editBox.KeyDown -= EditBox_KeyDown; editBox.KeyDown += EditBox_KeyDown; } } private void EditBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Tab) { var editBox = (TextBox)sender; int selectionStart = editBox.SelectionStart; editBox.Text = editBox.Text.Insert(selectionStart, "\t"); editBox.SelectionStart = selectionStart + 1; // 标记事件已处理,阻止默认行为 e.SuppressKeyPress = true; e.Handled = true; } }
效果验证
设置完成后,扫码输入的带制表符内容会完整保存在单元格中,后续直接读取单元格Value,调用Split('\t')拆分字符串即可获取最后一段的数字内容。
内容的提问来源于stack exchange,提问作者Miguel V
相关产品推荐
相关产品推荐

