带有不可编辑单词(标签)的TextBox

时间:2015-01-29 13:34:02

标签: c# .net winforms custom-controls .net-4.5

我正在尝试为我的电子邮件发送应用程序构建模板编辑模块。 现在它看起来像这样:

enter image description here

在右边,我有可用变量列表,当我发送电子邮件时,这些变量被替换为正确的值。

现在,当我双击列表项时,我正在添加右侧列表中的单词:

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内部构建的,我找不到任何可以做到这一点的组件,所以我决定在这里问,也许有人需要相同的功能或者可以指导我如何做到这一点。

总结我需要能够在文本框中的文本中添加标记,文本框应该将此标记视为整体 - 它应该是可选的,可移动的,用户应该能够删除它但不能编辑。

1 个答案:

答案 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);
    }
}

enter image description here