TextBox AutoCompleteStringCollection Предложить - PullRequest
0 голосов
/ 03 мая 2018

Я создал форму в 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)
    {

    }
}

Результат выглядит так:

enter image description here

Цель того, что я ищу, состоит в том, чтобы выбрать несколько значений из списка автоматического предложения. Когда пользователь выбрал первое значение, разделитель вроде ';' должен снова вызвать автоматическое предложение.

Это должно выглядеть так:

enter image description here

Может быть, какой-нибудь код / ​​идея в методе _TextChanged? Возможно ли в C # выделить выбранное значение, как в pic2?

Ваши идеи приветствуются!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вам необходимо создать свой пользовательский элемент управления для этого требования. Я создал похожий. размещение логики и кода - надеюсь, это поможет вам в получении основной идеи.

Вам необходимо создать два пользовательских элемента управления.

  1. Пользовательский элемент управления (контейнер для второго пользовательского элемента управления + текстовое поле, которое вы показываете нам в вопросе)
  2. Элемент управления тегами (будет содержать метку для отображения текста тега и метку ссылки «x» для его удаления) Вместе это создаст визуализацию единого пользовательского элемента управления. где вы можете напечатать (с выпадающим предложением), и как только вы нажмете ',', он создаст тег и сохранит его внутри.

Это будет выглядеть ниже, enter image description here

Вот код для этого.

Пользовательский элемент управления будет иметь следующие функции управления по умолчанию

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();
}

Конструктор Custom Control, как вы показали в вопросе,

    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;
    }

Теперь Tag Control.

    private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
    public  System.Windows.Forms.Label lblTagName;
    private System.Windows.Forms.LinkLabel llblRemove;

метка ссылки, llblRemove будет иметь событие щелчка ссылки, которое вызовет событие, которое пользовательский элемент управления перечисляет.

private void llblRemove_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
     if (Remvoed != null)
         Remvoed(this, EventArgs.Empty);
}

Теперь используйте этот пользовательский элемент управления в любом месте.

Я загрузил рабочий пример проекта на GitHub.

Найти Ссылка

0 голосов
/ 03 мая 2018

Вам нужно создать свой собственный компонент. Структура может быть:

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 и использовать это событие из Toolbox в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...