我正在尝试为我的电子邮件发送应用程序构建模板编辑模块。 现在它看起来像这样:
在右边,我有可用变量列表,当我发送电子邮件时,这些变量被替换为正确的值。
现在,当我双击列表项时,我正在添加右侧列表中的单词:
private void variablesLB_DoubleClick(object sender, EventArgs e)
{
var insert = variablesLB.SelectedItem.ToString();
var index = templateContentTB.SelectionStart;
templateContentTB.Text = templateContentTB.Text.Insert(index, insert);
templateContentTB.SelectionStart = index + insert.Length;
templateContentTB.Focus();
}
这一切都运行正常,但我无法阻止用户手动更改关键字,因此他可以将光标置于«Email»
内并将其更改为«Emaail»
例如,在文本字段中放置数据库字段后的水晶报表中,我可以选择整个名称作为一个,按退格键我可以删除整个名称。
我知道这个功能不是在WinForms TextBox内部构建的,我找不到任何可以做到这一点的组件,所以我决定在这里问,也许有人需要相同的功能或者可以指导我如何做到这一点。
总结我需要能够在文本框中的文本中添加标记,文本框应该将此标记视为整体 - 它应该是可选的,可移动的,用户应该能够删除它但不能编辑。
答案 0 :(得分:0)
使用RichTextBox可以实现您想要的效果。
基本上下面的代码是查找前缀和后缀搜索它们之间的字符串,如果找到字符串,则会在变量集合中选择整个标记字符串。
最终结果是,只要用户选择标记的一部分,它就会自动选择前缀和后缀之间的所有文本。
public partial class Form1 : Form
{
public const char Prefix = '<';
public const char Suffix = '>';
private readonly List<string> _tags = new List<string> {"email"};
public Form1() { InitializeComponent(); }
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
int startOfVar = 0;
int endOfVar = -1;
for (int i = richTextBox1.SelectionStart - 1; i >= 0; i--)
{
if (richTextBox1.Text[i] == Suffix)
return;
if (richTextBox1.Text[i] == Prefix)
{
startOfVar = i + 1;
break;
}
}
for (int i = startOfVar; i < richTextBox1.TextLength; i++)
{
if (richTextBox1.Text[i] == Suffix)
{
endOfVar = i;
break;
}
}
if (startOfVar < endOfVar)
{
var varString = richTextBox1.Text.Substring(startOfVar, endOfVar - startOfVar);
if (_tags.Contains(varString))
{
richTextBox1.Select(startOfVar - 1, endOfVar - startOfVar + 2);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.AppendText(Prefix + _tags[0] + Suffix);
}
}