文本框自动完成字符串集合建议
TextBox AutoCompleteStringCollection Suggest
我在 C# 中创建了一个带有文本框 CustomSource 的表单:
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)
{
}
}
结果如下所示:
我正在寻找的目的是 select 来自自动建议列表的多个值。当用户 selected 第一个值时,像';'这样的分隔符应该会再次触发自动建议。
它应该是这样的:
也许 _TextChanged 方法中有一些 code/idea?
是否可以在 C# 中像 pic2 那样突出显示 selected 值?
欢迎提出您的想法!
您需要创建自己的组件。
结构可以是:
Panel (the main container with white background and border)
|-> FlowLayoutPanel (the container for already added tags); Dock = Left
| |-> TagControl (you custom control for tag label)
| |-> ... (more tags if required)
|-> TextBox (the one with autocompletion with no borders); Dock = Fill;
您可以封装到您自己的 Control/UserControl 并在设计器的工具箱中使用该事件。
您需要为此要求创建自定义控件。
我创建了一个类似的。发布逻辑和代码 - 希望它可以帮助你获得基本的想法。
您需要创建两个用户控件。
- 自定义控件(第二个用户控件的容器 + 您向我们展示的相关文本框)
- 标签控件(将包含用于显示标签文本的标签和用于删除标签的 link 标签 'x')
它将一起创建单个单元自定义控件的可视化。您可以在其中输入(根据您的下拉建议),一旦您按下 ',' ,它将创建一个标签并将其存储在其中。
它将如下所示,
这是相关代码。
自定义控件默认有以下cnntrols
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事件,如下所示。
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();
}
自定义控件的构造函数,如您在问题中所示,
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;
link 标签,llblRemove 将有 link 标签点击事件,这将引发一个事件,自定义控件正在列出。
private void llblRemove_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (Remvoed != null)
Remvoed(this, EventArgs.Empty);
}
现在,在任何您想使用的地方使用这个自定义控件。
我已经在 GitHub.
上上传了工作示例项目
找一个Link
我在 C# 中创建了一个带有文本框 CustomSource 的表单:
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)
{
}
}
结果如下所示:
我正在寻找的目的是 select 来自自动建议列表的多个值。当用户 selected 第一个值时,像';'这样的分隔符应该会再次触发自动建议。
它应该是这样的:
也许 _TextChanged 方法中有一些 code/idea? 是否可以在 C# 中像 pic2 那样突出显示 selected 值?
欢迎提出您的想法!
您需要创建自己的组件。 结构可以是:
Panel (the main container with white background and border)
|-> FlowLayoutPanel (the container for already added tags); Dock = Left
| |-> TagControl (you custom control for tag label)
| |-> ... (more tags if required)
|-> TextBox (the one with autocompletion with no borders); Dock = Fill;
您可以封装到您自己的 Control/UserControl 并在设计器的工具箱中使用该事件。
您需要为此要求创建自定义控件。 我创建了一个类似的。发布逻辑和代码 - 希望它可以帮助你获得基本的想法。
您需要创建两个用户控件。
- 自定义控件(第二个用户控件的容器 + 您向我们展示的相关文本框)
- 标签控件(将包含用于显示标签文本的标签和用于删除标签的 link 标签 'x') 它将一起创建单个单元自定义控件的可视化。您可以在其中输入(根据您的下拉建议),一旦您按下 ',' ,它将创建一个标签并将其存储在其中。
它将如下所示,
这是相关代码。
自定义控件默认有以下cnntrols
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事件,如下所示。
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();
}
自定义控件的构造函数,如您在问题中所示,
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;
link 标签,llblRemove 将有 link 标签点击事件,这将引发一个事件,自定义控件正在列出。
private void llblRemove_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (Remvoed != null)
Remvoed(this, EventArgs.Empty);
}
现在,在任何您想使用的地方使用这个自定义控件。
我已经在 GitHub.
上上传了工作示例项目找一个Link