如何忽略单元格输入中的制表键而不是制表符?数据网格视图 C#

Posted

技术标签:

【中文标题】如何忽略单元格输入中的制表键而不是制表符?数据网格视图 C#【英文标题】:How can I ignore tab key in cell input but not tab char? DataGridView C# 【发布时间】:2021-10-14 12:25:17 【问题描述】:

例如,我有一个像这样的字符串:

ItemA   MMC FG  MMC 0802    EA  1   21175393

上面有 5 个标签:

ItemA/tab/MMC FG/tab/MMC 0802/tab/EA/tab/1/tab/21175393

这个字符串是由从标签扫描的二维码输入接收的,现在,这里的问题是输入是在 DataGridView 的一个单元格内完成的,所以,当第一个选项卡出现时,它会改变选中的列到下一个。

将属性“StandardTab”设置为 False 有点工作,但现在当我输入 QR 码字符串时,它会在第一个选项卡出现时停止编辑模式。 我正在尝试使用

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        
            if(keyData == Keys.Tab && dGItems.EditingControl != null && msg.HWnd == dGItems.EditingControl.Handle 
                && dGItems.SelectedCells.Cast<DataGridViewCell>().Any(x => x.ColumnIndex ==4))
            
                return true;
            
            return base.ProcessCmdKey(ref msg, keyData);
        

这会有所帮助,但它会将扫描的 QR 码字符串中的选项卡替换为空格,我不希望这种情况发生。 上面有 5 个标签:

ItemAMMC FGMMC 0802EA121175393

如何在不替换或忽略它们的情况下允许单元格中的选项卡输入? (这是因为我需要抓住最后一个标签才能收到它旁边的数字)

【问题讨论】:

【参考方案1】:

解决者:

    首先,创建两个变量:一个计数器和一个字符串。
int counter = 0;
string keyChar = "";
    接下来,创建一个方法来处理 Tab 键的出现并对其进行计数。当 Tab 键重复 N 次(在我的特定情况下为 5 次)时,使用 KeysConverter 保存 keyChar。
      public string CatchQRInput(Keys keyData)
        
            KeysConverter kc = new KeysConverter();
            if (keyData == Keys.Tab) counter++;

            if(counter == 5)
            
                keyChar += kc.ConvertToString(keyData);
            
            // Replace the 5th Tab 
            keyChar = keyChar.Replace("Tab", "");
            return keyChar;
        
    在ProcessCmdKey中调用上述方法:
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        
            CatchQRInput(keyData);

            if (keyData == Keys.Tab && dGItems.EditingControl != null && msg.HWnd == dGItems.EditingControl.Handle 
                && dGItems.SelectedCells.Cast<DataGridViewCell>().Any(x => x.ColumnIndex ==4))
            
                return true;
            
            return base.ProcessCmdKey(ref msg, keyData);
        
    这样,最后一个值将存储在字符串keyChar中,这不是最后要做的事情,因为您可以清除字符串以便存储多个值,但对于我的特殊情况来说已经足够了。

【讨论】:

以上是关于如何忽略单元格输入中的制表键而不是制表符?数据网格视图 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何使在使用word制表格时自动换行但不增加行距???

如何垂直而不是水平制表符

MarkDown笔记二

如何让linux中的空格和制表符原形毕露

Xceed DataGrid:使用键盘导航编辑单元格

将带有换行符的值导出到 Excel 中的单个单元格中。 jQuery 数据表