2

我想要一个可以向其中添加“文本块”的文本框。“文本块”的定义是:

  • 删除文本框中的字符,该字符是块的一部分,导致整个块被删除。
  • 将文本框中的胡萝卜位置设置为块的一部分,导致整个块被选中。
  • 用户在块中间写入字符的任何尝试都将失败,随后会出现相应的消息框。

我有一个附加了 CellClick 事件的 DataGridView。我希望当 CellClick 事件发生时,单元格的内容将被放置在一个文本框中,并将被视为一个文本块。添加块的位置将在文本框的胡萝卜位置或文本框的末尾,如果文本框没有聚焦,因此胡萝卜不闪烁。

我还希望文本框可以用作普通文本框,这意味着用户可以添加或删除他想要的任何字符/文本,除了必须按照上面定义的完全添加/删除的文本块。

也许我需要使用除文本框之外的其他 GUI 控件来完成此任务,我不知道。

我考虑了一些解决方案,但我不知道哪个是最好的(可能没有一个):(备注:以下每个解决方案都假定附加了一个 KeyPress 事件)

  1. 在每个块之前和之后添加隐藏字符(如果可能)以标记它。
  2. 创建代表所有文本块的对象列表,每个对象包含两个字段:startIndex、endIndex。不太好,因为从文本框中添加或删除字符需要将位于添加/删除的字符之后的块的所有索引更新为每个字符的 +1 或 -1。
  3. 创建代表文本框中所有文本的对象列表,每个对象包含两个字段:文本、标志。每次手动添加一个字符或事件添加一个单词时,都会将一个对象添加到列表中,并将对象的文本字段设置为添加的字符,如果字符是单词,则将对象的标志字段设置为 true由事件添加,否则为 false。
  4. 将文本框分成两部分,并为事件添加的每个文本块在它们之间创建一个小文本框,并对小文本框进行不同的处理。当小文本框中的文本被删除时,整个文本框控件被删除,分割的文本框被合并。听起来我不太好。

实现这一点的最佳方法是什么?

谢谢!

4

1 回答 1

1

我从未见过具有这种行为的控件。我并不是说有人没有写过,只是不太可能。这意味着您将不得不构建它。

如果您从未创建过自定义控件,请在网络上搜索“创建自定义 winforms 控件”或类似内容。您首先需要了解基本技术。

然后你会想知道如何存储底层文本以供编辑。您可以从学习标准文本编辑控件常用的一些技术开始。选择一个您可以针对您的自定义场景进行修改的选项。以下是我的一些想法:

间隙缓冲器

绳索

链条

祝你好运!

于 2012-07-12T19:40:59.130 回答