如何忽略单元格输入中的制表键而不是制表符字符?数据网格视图 C#
How can I ignore tab key in cell input but not tab char? DataGridView C#
例如,我有这样一个字符串:
ItemA MMC FG MMC 0802 EA 1 21175393
上面有 5 个标签:
ItemA/tab/MMC FG/tab/MMC 0802/tab/EA/tab/1/tab/21175393
此字符串由从标签扫描的 QR 码输入接收,现在,这里的问题是输入是在 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
如何允许单元格中的制表符输入而不替换或忽略它们?
(这是因为我需要抓住最后一个标签才能收到旁边的数字)
解决者:
- 首先,创建两个变量:一个计数器和一个字符串。
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 中,这不是最后要做的事情,因为您可以清除字符串以存储多个值,但对于我的特定情况就足够了。
例如,我有这样一个字符串:
ItemA MMC FG MMC 0802 EA 1 21175393
上面有 5 个标签:
ItemA/tab/MMC FG/tab/MMC 0802/tab/EA/tab/1/tab/21175393
此字符串由从标签扫描的 QR 码输入接收,现在,这里的问题是输入是在 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
如何允许单元格中的制表符输入而不替换或忽略它们? (这是因为我需要抓住最后一个标签才能收到旁边的数字)
解决者:
- 首先,创建两个变量:一个计数器和一个字符串。
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 中,这不是最后要做的事情,因为您可以清除字符串以存储多个值,但对于我的特定情况就足够了。