(C#) 从 TextBox WinForms 的删除字符中获取索引
Posted
技术标签:
【中文标题】(C#) 从 TextBox WinForms 的删除字符中获取索引【英文标题】:(C#) Getting the index from a remove char of a TextBox WinForms 【发布时间】:2021-06-30 19:29:38 【问题描述】:我有一个TextBox
,用户可以在其中添加和删除文本,但是每个字符都与 DataGridView 上的一行相关,并具有各种用户可选择的选项。因此知道要删除的字符非常重要,因为 DataGridView 需要知道必须删除的行。
起初,我有一个简单的字符串比较方法,但是对于重复的字符序列(例如“aaaa”),它无法确定哪个字母被删除,并且默认返回序列中最后一个字符的索引。所以我上网查看是否有办法跟踪文本插入符号的位置,并且有......但不适用于WinForms。我发现插入符号的唯一方面是SelectionStart
、SelectionLength
和SelectionText
;这对于批量删除很有用,但在用户点击后退按钮/删除按钮时无效。
我现在很困惑。 “最简单”的解决方案是切换到 XAML,因为它跟踪插入符号的位置......但这感觉更像是谈话。尽管如此,我仍然不知道如何解决这个问题。
【问题讨论】:
听起来可以设计一个更易于使用的 UI。想到 DGV 上的上下文菜单和点击事件 您是否考虑过在文本框中捕获 KeyPress 事件? 仅仅检测缺少哪个字符或选择在哪里是不够的,因为可以向后(使用 Backspace)和向前(使用 Delete)删除。也可以扩展选择并一次删除多个字符。因此,除了选择的位置和长度之外,您还需要知道按下的是哪个键。正如@NicholasHunter 所说,您必须捕获关键事件。 @OlivierJacot-Descombes & @/NicholasHunter :是的,我正在考虑一个系统,它不仅可以捕获 Backspace 和 Delete,还可以使用箭头键,以便用户可以在他们的文本框中导航。我担心的是捕获 shift+ 和 ctrl+ 组合,如果用户使用鼠标选择位置... 【参考方案1】:您可以尝试定义变量originalText
来保存原始文本框文本和textlength
来保存文本长度。
订阅textBox1_Enter
给他们初始值。
private void textBox1_Enter(object sender, EventArgs e)
textlength = textBox1.Text.Length;
originalText = textBox1.Text;
然后订阅textBox1_TextChanged
获取deleted chars
。
int textlength;
string originalText;
private void textBox1_TextChanged(object sender, EventArgs e)
if (textlength > textBox1.Text.Length)
Console.WriteLine($"You deleted the char from textBox1.SelectionStart to textBox1.SelectionStart + textlength - textBox1.Text.Length - 1");
Console.WriteLine($"deleted substring originalText.Substring(textBox1.SelectionStart, textlength - textBox1.Text.Length)");
// reset
textlength = textBox1.Text.Length;
originalText = textBox1.Text;
【讨论】:
非常感谢!我如此专注于插入符号和文本操作的细节,以至于我没有意识到解决方案就像公式一样简单! (_ _;;)以上是关于(C#) 从 TextBox WinForms 的删除字符中获取索引的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# Winforms 程序的文本框中突出显示文本?