问题描述
我已经用C#创建了一个带有用于文本框的CustomSource的表单:
I have created a form in C# with a CustomSource for a textbox:
public partial class FormLookup : Form
{
AutoCompleteStringCollection source = new AutoCompleteStringCollection();
public FormLookup()
{
InitializeComponent();
source.Add("Test");
source.Add("TestItem");
source.Add("TestValue");
this.textBox1.AutoCompleteCustomSource = source;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
}
结果如下:
我要寻找的目的是从自动建议列表中选择多个值.当用户选择第一个值时,将使用诸如;"之类的分隔符.应该再次触发自动建议.
The purpose of what I am looking for is to select multiple values from the auto suggestion list. When the user selected the first value, a seperator like ';' should trigger the auto suggestion again.
它应该看起来像这样:
也许_TextChanged方法中有一些代码/想法?在C#中是否可以像在pic2中那样突出显示所选的值?
Maybe some code/idea in the _TextChanged method?Is it possible in C# to highlight the selected value like in pic2?
欢迎您提出想法!
推荐答案
您需要为此要求创建自定义控件.我已经创建了一个类似的.发布逻辑和代码-希望它可以帮助您获得基本的想法.
You need to create your custom control for this requirement.I have created similar one. posting logic and code - hope it may help you in getting basic Idea.
您需要创建两个用户控件.
You need to create two user controls.
- 自定义控件(第二个用户控件的容器+向您显示有问题的文本框)
- 标签控件(将包含显示标签文本的标签和链接标签"x"以将其删除)它将一起创建单个单元自定义控件的可视化.您可以在其中键入(带有下拉建议),然后按,",它将创建一个标签并将其存储在其中.
- Custom Control (container for second user control + text box which you show us in question)
- Tag control (will contain label to show Text of tag and link label 'x' to remove it)Together it will create a visualization of single unit custom control. where you can type (with you drop down suggestion) and once you press ',' , it will create a tag and store it within.
如下所示,
这是代码.
默认情况下,自定义控件将具有以下cnntrols
Custom Control will have following cnntrols by default
private System.Windows.Forms.FlowLayoutPanel flayoutCustomControlContainer;
public System.Windows.Forms.TextBox textBox1; //Marking this public so it can be directly accessed by external code.
此处flayoutCustomControlContainer
默认包含textBox1
.
textBox1
将具有Key Up事件,如下所示.
textBox1
will have Key Up event, which will be like below.
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Oemcomma) //we will perform this on every ',' press
{
flayoutCustomControlContainer.Controls.Remove(textBox1);
TagControl tag = new TagControl(); //creating new Tag control
tag.lblTagName.Text = textBox1.Text.TrimEnd(",".ToCharArray());
tag.Remvoed += tag_Remvoed; //subscribing "Removed" event of Tag
tag.Width = tag.lblTagName.Width + 50;
tag.Height = tag.lblTagName.Height + 5;
flayoutCustomControlContainer.Controls.Add(tag);
textBox1.Text = "";
flayoutCustomControlContainer.Controls.Add(textBox1);
textBox1.Focus();
}
}
void tag_Remvoed(object sender, EventArgs e)
{
this.flayoutCustomControlContainer.Controls.Remove((Control)sender);
textBox1.Focus();
}
自定义控件的构造函数,如您所显示的,
Constructor of Custom Control, as you shown in question,
public CustomControl()
{
InitializeComponent();
source.Add("Test");
source.Add("TestItem");
source.Add("TestValue");
this.textBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.textBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource;
this.textBox1.AutoCompleteCustomSource = source;
}
现在,标签控制.
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
public System.Windows.Forms.Label lblTagName;
private System.Windows.Forms.LinkLabel llblRemove;
链接标签,llblRemove将具有链接标签click事件,该事件将引发一个事件,该事件将在Custom控件中列出.
link label, llblRemove will have link lable click event which will raise an event, which Custom control is listing.
private void llblRemove_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (Remvoed != null)
Remvoed(this, EventArgs.Empty);
}
现在,在您要使用的任何地方使用此自定义控件.
Now, use this Custom Control anywhere you want to use.
我已经在GitHub上上传了工作示例项目.
I have uploaded working example project on GitHub.
找到> 链接
这篇关于TextBox AutoCompleteStringCollection建议的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!