带有不可编辑单词(标签)的文本框
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);
【讨论】:
我会马上检查 :) 那么删除呢?当我将光标放在标签之后并按退格键或之前按删除时? 使用当前代码不会删除它。但是您可以将其更改为您想要的行为方式。代码可能还有其他一些缺陷,但没有什么是难以克服的。以上是关于带有不可编辑单词(标签)的文本框的主要内容,如果未能解决你的问题,请参考以下文章
c#如何使一个文本框变为不可编辑?但是又可以复制里面的数据?