(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。我发现插入符号的唯一方面是SelectionStartSelectionLengthSelectionText;这对于批量删除很有用,但在用户点击后退按钮/删除按钮时无效。

我现在很困惑。 “最简单”的解决方案是切换到 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 TextBox 等的垂直对齐

防止在Winforms C#中右键单击文本框

如何在 C# Winforms 程序的文本框中突出显示文本?

正则表达式无法过滤 WinForms 中的 TextBox 字符

另存为,winforms(c#)[重复]

VS2019继承的winforms控件未编译