RichTextBox将输入替换为“;“随机”;unicode字符

本文关键字:unicode 字符 随机 替换 RichTextBox 输入 | 更新日期: 2023-09-27 18:20:49

我有一个允许用户浏览数据的应用程序。我有控制导航的菜单项和显示数据的RichTextBox。非常简单。

tl;dr版本

除了一个奇怪的问题外,大多数都能工作。在某些实例中,RichTextControl会将键入的第一个字符替换为随机的unicode字符。请随意下载此示例应用程序并亲自查看:

http://www.technitivity.com/stackoverflow/RichTextFocusTest.zip

完整解释

在行之间导航时会出现此问题。它最好用几个用例来描述:

用例1

  1. 导航到数据集中的任何位置
  2. 按后退
  3. 按next
  4. 键入任意一个字母,比如"F"
  5. 结果:"F"按预期显示在RichTextBox中

用例2

  1. 导航到数据集中的任何位置
  2. 按下两次
  3. 按next两次
  4. 键入字母"F"
  5. 结果:代替"F","ᅲ"出现在RichTextBox中

用例3

  1. 导航到数据集中的任何位置
  2. 下一步两次
  3. 向后按两次
  4. 键入字母"F"
  5. 结果:代替"F","᧴"出现在RichTextBox中

导航过程只需要:

// either forward
i++;
// or backward
i--;
// then update
RichTextBox1.Text = MyData[i];

程序性发言:

// This works
RichTextBox1.Text = MyData[3];
// This works
RichTextBox1.Text = MyData[3];
RichTextBox1.Text = MyData[2];
RichTextBox1.Text = MyData[3];
// This doesn't work
RichTextBox1.Text = MyData[3];
RichTextBox1.Text = MyData[2];
RichTextBox1.Text = MyData[1];
RichTextBox1.Text = MyData[2];
RichTextBox1.Text = MyData[3];

诚然,这并不是实际发生的事情,而是有效发生的事情。

需要注意的是,如果RichTextBox在更新之间失去焦点,则不会发生。只有当RichTextBox在根据上面的描述更新其Text属性时保持焦点时,才会发生这种情况。

我完全不知道是什么导致了这个问题,如何解决它,或者为什么我似乎找不到其他有这个问题的人。

我已经在64位Windows7和32位WindowsVista上复制了它。这是在.NET Framework 4上,尽管我也能够在.NET Framework 2项目上复制。

希望其他人已经遇到了这个问题(并解决了它!)

编辑:

这是一张截图:

http://www.technitivity.com/stackoverflow/RichTextBox-Screenshot1.png

正如评论中提到的,要在示例应用程序中重现这一点,您必须使用键盘菜单快捷键。如果您单击菜单项(或工具栏按钮),RichTextBox就会失去焦点,问题就会消失。但是,如果您使用Alt+Left或Alt+Right(后退/下一步)和然后类型浏览项目,您应该会看到上面屏幕截图中显示的内容。

RichTextBox将输入替换为“;“随机”;unicode字符

我不太愿意称之为"答案",但我找不到"发布黑客"按钮,而这次黑客攻击确实让我暂时度过了难关。我对此并不激动,但有时你只需要继续前进。给你。

由于RichTextBox失去焦点后问题消失了,我尝试了一个实验:

  • 我创建了一个可见的0像素宽的文本框,名为Hacktastic
  • 我在RichTextBox中添加了一个KeyPress事件
  • 按键时:
    • Hacktastic.Focus()
    • Hacktastic.Text=KeyChar.ToString()
    • MyRichTextBox.Focus()

这起到了作用,(至少目前)我坚持把它作为一个解决方案。如果有人仍然可以尝试我的样本项目并复制和/或解决这个问题,我希望得到进一步的反馈:

http://www.technitivity.com/stackoverflow/RichTextFocusTest.zip

测试项目中的重新编程步骤:

  1. 使用Alt+Right箭头,在数据集中移动到第四条记录
  2. 使用Alt+向左箭头,将数据集向后移动两个位置,移动到第二条记录
  3. 使用Alt+Right箭头,移回第四条记录
  4. 按任意KeyChar
  5. 观察KeyChar被替换为"随机"的大值unicode字符

我说"随机"是因为一组特定的导航(上一次/下一次)击键将插入完全相同的unicode字符。然而,根据你在片场的起点或后退的距离,你会得到一个不同的角色。

另外,请注意,只返回一条记录并向前转发一条记录不会导致问题。你必须移动至少两个记录才能实现这一点。