带有不可编辑单词(标签)的文本框

Posted

技术标签:

【中文标题】带有不可编辑单词(标签)的文本框【英文标题】:TextBox with non editable words (tags) 【发布时间】:2015-03-28 18:12:24 【问题描述】:

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

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

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

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

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

【问题讨论】:

我不知道您使用什么控件来显示姓名、姓氏、电子邮件等,但没有IsReadOnly 标志,您可以将其设置为True @user3596113 抱歉,如果我描述有问题,但是当单击右侧的列表(列表框)时,我正在向文本框添加文本,这部分工作正常,我希望在文本框中包含不可编辑的单词。 首先想到的是:使用RichTextBox 和一些自定义对象(图像?)作为标签。其他可能性是 highlight 标记作为文本更改(也是RichTextBox),以便用户查看他是否 destroy 某些东西。由于允许用户编辑文本,也许您会向他显示完整文本?其中<Name> 已经替换为例如John? 看看codeproject.com/Tips/789293/… 通常很难阻止用户朝自己的头部开枪。完成后提供一个预览类型的功能,其中令牌被替换。 VS 或多或少不会阻止您输入Tostring 代替ToString(),但不会做太多事情。 【参考方案1】:

使用 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);
    

【讨论】:

我会马上检查 :) 那么删除呢?当我将光标放在标签之后并按退格键或之前按删除时? 使用当前代码不会删除它。但是您可以将其更改为您想要的行为方式。代码可能还有其他一些缺陷,但没有什么是难以克服的。

以上是关于带有不可编辑单词(标签)的文本框的主要内容,如果未能解决你的问题,请参考以下文章

jQuery设置文本框为不可编辑

c#如何使一个文本框变为不可编辑?但是又可以复制里面的数据?

在文本框中,保护第一个单词,但允许添加/编辑这些单词之后的文本

ASP 文本框 不可修改

在输入框中的光标后添加不可编辑的文本

C#Visual Studio 2017.单词在文本框和标签中更改了顺序