我正在使用 Winform 作为工具进行邮件合并。我提供了 2 个模板,一个用于商务信函,另一个用于备忘录。对于信件,用户通常键入信件的正文,而其他信息是从用户通过单击“选择收件人”选项创建的数据文件中挑选出来的。
我想限制我的用户只能键入正文,并且指针必须位于第二行称呼之后。指针不能从该位置向后移动,但当然可以向前移动。我该怎么做呢?
如果我不清楚,我很抱歉。
如果您的文本在 aTextBox
或 a中RichTextBox
,您可以选择控件并将光标放置在
// Set the cursor into the text box
bodyTextBox.Focus();
// Place the cursor at the desired position in the text
bodyTextBox.Select(start, 0);
你必须弄清楚第三行从哪里开始
const int indent = 30; // Desired indentation
// Place focus in this control
bodyTextBox.Focus();
// The following work only if we have at least 3 lines of text
if (bodyTextBox.Lines.Length >= 3) {
int start = bodyTextBox.Lines[0].Length + // Length of first line
bodyTextBox.Lines[1].Length + // Length of second line
4 + // 2 x 2 characters for two CR-LFs
Math.Min(indent, bodyTextBox.Lines[2].Length);
bodyTextBox.Select(start, 0);
}
我假设文本看起来像这样
第一行文本。<CR><LF> 第二行文本。<CR><LF> <缩进 30 个空格> ^ 想要的位置
为了将光标设置在正确的位置,我们需要计算从文本开头开始的字符总数。由于您要将光标定位在第三行,因此这是第一行的长度加上它们末尾的两个 CR-LF(换行符)加上第三行开头的 30 个字符。如果第三行的长度小于 30 个字符,我们不能将光标放在那里,因此我们将它放在尽可能靠右的位置,即在这一行的最后一个字符上Math.Min(indent, bodyTextBox.Lines[2].Length);
最后我们用 . 将光标放在那里Select
。由于我们不想选择文本,我们将选择的长度定义为零。