How to Set default combobox
Asked Answered
M

5

17

So I've been looking to set a default value for my combobox. I found a few things but none of them seem to work.

Actually, it works if I create a simple combobox and use comboBox1.SelectedIndex = comboBox1.Items.IndexOf("something") but once I dynamically generate the contents of the comboboxes, I can't get it to work anymore.

This is how I fill my combo box (located in the class's constructor);

        string command = "SELECT category_id, name FROM CATEGORY ORDER BY name";
        List<string[]> list = database.Select(command, false);

        cbxCategory.Items.Clear();

        foreach (string[] result in list)
        {
            cbxCategory.Items.Add(new ComboBoxItem(result[1], result[0]));
        }

I can't seem to get it to work to set a default value, like if I place cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf("New") below the above code, it won't work.

WinForms, by the way.

Thank you in advance.

Makings answered 29/1, 2013 at 18:44 Comment(5)
WPF? Winforms? Please specify it! In the tags, in the title or in the question.Funda
Do you have a debugger to check that the value is set to a valid index (i.e. not -1 etc)? If it is, you may simply need to call cbxCategory.Refresh()Biserrate
SelectedIndex should work fine. As the answers suggested, make sure that what you are looking for actually exists...otherwise I recommend using a fixed number rather than a search.Prehistory
Sadly, a fixed number is not an option. I will run the debugs.Makings
could you share your ComboBoxItem class?Alpenhorn
T
24

cbxCategory.SelectedIndex should be set to an integer from 0 to Items.Count-1 like

cbxCategory.SelectedIndex  = 2;

your

 cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf("New") 

should return -1 as long as no ComboboxItem mutches the string ("New");

another solution though i don't like it much would be

foreach(object obj in cbxCategory.Items){ 
    String[2] objArray = (String[])obj ;
    if(objArray[1] == "New"){
       cbxCategory.SelectedItem = obj;
       break; 
    }
}

perhaps this also requires the following transformation to your code

    foreach (string[] result in list)
    {
      cbxCategory.Items.Add(result);
    }

I haven't tested the code and i am not sure about the casting to String[2] but something similar should work

Tatty answered 29/1, 2013 at 18:46 Comment(2)
I have no idea on what index my default item is going to be as the combobox is populated with data from the database. Therefor I have to use IndexOf (or something similar to match values). It works if I staticly add the items to the dropdown instead of loading them from the database - but whenever I load them from the database it doesn't work somehow.Makings
after you load them set cbxCategory.SelectedIndex = 0;Tatty
G
1

It looks like you're searching the cbxCategory.Items collection for a string, but it contains items of type ComboBoxItem. Therefore the search will return -1.

Gca answered 29/1, 2013 at 18:56 Comment(3)
You are absolutely right. How would you recommend searching for it?Makings
ComboBoxItem is not a class in the System.Windows.Forms namespace (are you sure this is WinForms?); since it appears to be custom class then I can't provide you with the exact search code because you haven't provided the property names. You're just going to have to iterate over the collection to find the correct item. Unfortunately ComboBox.ObjectCollection is not very LINQ-friendly. You could also just remember the index as you are initially adding items to the control.Gca
it seems that your explanation is not true. see my answer :)Alpenhorn
P
1

You can use LINQ.

//string command = "SELECT category_id, name FROM CATEGORY ORDER BY name";
//List<string[]> list = database.Select(command, false);
// sample data...
List<string[]> list = new List<string[]> { new string[] { "aaa", "bbb" }, new string[] { "ccc", "ddd" } };

cbxCategory.Items.Clear();

foreach (string[] result in list)
{
    cbxCategory.Items.Add(new ComboBoxItem(result[1], result[0]));
}

ComboBoxItem tmp = cbxCategory.Items.OfType<ComboBoxItem>().Where(x => x.ResultFirst == "bbb").FirstOrDefault();
if (tmp != null)
    cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf(tmp);

ComboBoxItem class:

class ComboBoxItem
{
    public string ResultFirst { get; set; }
    public string ResultSecond { get; set; }

    public ComboBoxItem(string first, string second)
    {
        ResultFirst = first;
        ResultSecond = second;
    }
}
Positronium answered 29/1, 2013 at 19:10 Comment(0)
A
0

Here's my simple solution

        var list = comboBox1.Items.Cast<string>().ToList();
        cbxCategory.SelectedIndex = list.FindIndex(c => c.StartsWith("test"));
Alpenhorn answered 29/1, 2013 at 23:4 Comment(2)
This solution will cause an InvalidCastException because ComboBoxItem (presumably a custom class since it's not part of Windows Forms) cannot be cast as a string.Gca
yes, if the OP will provide his the Custom ComboBox it would be better :D since we're focus in default ComboBox.Alpenhorn
B
0

My solution:

int? defaultID = null;
foreach (DataRow dr in dataSource.Tables["DataTableName"].Rows)
{
     if ((dr["Name"] != DBNull.Value) && ((string)dr["Name"] == "Default Name"))
     {
          defaultID = (int)dr["ID"];
     }
}
if (defaultID != null) comboBox.SelectedValue = defaultID;
Behalf answered 9/9, 2016 at 9:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.