Shmosi
Shmosi

Reputation: 332

check dropdown menu if matches

Long story short: There are specific tags given (like Pop, Rock, Metal) and the User should write into a textbox and every time he adds a char the given tags are checked if one (or more) matches. At the moment I'm using a combobox with the following code:

    private void EnterComboBox_TextChanged(object sender, EventArgs e)
    {
        List<string> AllTags = new List<string>();

        AllTags.Add("Pop");

        if (AlleTags[0].ToLower().StartsWith(EnterComboBox.Text.ToLower()))
        {
            EnterComboBox.Items.Clear();
            EnterComboBox.Items.Add("Pop");
            EnterComboBox.DroppedDown = true;
        }
    }

this is working fine but the problem is, that after the first char entered the dropbox drops down and the entered text is marked and will be overwritten when a new char is entered. Any ideas how I could fix this? Every idea is welcome it doesn't have to be a combo box :)!

Edit: After some more (detailed) research I realized I could explain it like this: Basically I want the combobox the behave like the search-bar from google. The users enters letters and in the dropdown menu are autocomplete suggestions

At the moment I solved it like this: I placed a textbox in front of a combobox so that only the arrow of the combobx is visible and if you click on it you automatically write in the textbox.

    public Form1()
    {
        InitializeComponent();
        EingabeTextBox.AutoSize = false;
        EingabeTextBox.Size = new Size(243, 21);      //the size of the combobox is 260;21
    }

    private void EingabeTextBox_TextChanged(object sender, EventArgs e)
    {
        EingabeComboBox.Items.Clear();

        List<string> AlleTags = new List<string>();

        AlleTags.Add("Example");

        if (AlleTags[0].ToLower().StartsWith(EingabeTextBox.Text.ToLower()))
        {
            EingabeComboBox.Items.Add(AlleTags[0]);
            EingabeComboBox.DroppedDown = true;
        }
    }

For me it would work like this. I hope I can help someone else with this too, but I am still open for any better ideas :)!

Upvotes: 0

Views: 50

Answers (1)

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112334

Changing the ComboBox entries while typing into it obviously creates undesired interferences. Instead combine a TextBox and a ListBox.

private bool changing;

private void TextBox_TextChanged(object sender, EventArgs e)
{
    if (!changing) {
        changing = true;
        try {
            // manipulate entries in the ListBox
        } finally {
            changing = false;
        }
    }
}

private void ListBox_IndexChanged(object sender, EventArgs e)
{
    if (!changing) {
        changing = true;
        try {
            // Put selected entry into TextBox
        } finally {
            changing = false;
        }
    }
}

The changing guard makes sure that the ListBox does not influence the TextBox while you are entering text into the TextBox and vice versa.

The try-finally ensures that the guard will be reset in any circumstances, even if an exception should occur.

Upvotes: 1

Related Questions