web-dev-qa-db-fra.com

Comment définir la zone de liste déroulante par défaut

J'ai donc cherché à définir une valeur par défaut pour ma combobox. J'ai trouvé quelques choses mais aucune ne semble fonctionner.

En fait, cela fonctionne si je crée une combobox simple et utilise comboBox1.SelectedIndex = comboBox1.Items.IndexOf("something") mais une fois que j'ai généré dynamiquement le contenu des comboboxs, je ne peux plus le faire fonctionner.

C'est ainsi que je remplis ma zone de liste déroulante (située dans le constructeur de la classe);

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

Je n'arrive pas à le faire fonctionner pour définir une valeur par défaut, comme si je place cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf("New") sous le code ci-dessus, cela ne fonctionnera pas.

WinForms, au fait.

Merci d'avance.

17
Roel

cbxCategory.SelectedIndex doit être défini sur un entier de 0 à Items.Count-1 comme

cbxCategory.SelectedIndex  = 2;

votre

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

doit renvoyer -1 tant qu'aucun ComboboxItem n'efface la chaîne ("Nouveau");

une autre solution si je ne l'aime pas beaucoup serait

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

peut-être que cela nécessite également la transformation suivante de votre code

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

Je n'ai pas testé le code et je ne suis pas sûr de la conversion en String [2] mais quelque chose de similaire devrait fonctionner

24
iltzortz

Vous pouvez utiliser 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 classe:

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

    public ComboBoxItem(string first, string second)
    {
        ResultFirst = first;
        ResultSecond = second;
    }
}
1
kmatyaszek

Il semble que vous recherchiez une chaîne dans la collection cbxCategory.Items, mais il contient des éléments de type ComboBoxItem. Par conséquent, la recherche renverra -1.

1
RogerN

Voici ma solution simple

        var list = comboBox1.Items.Cast<string>().ToList();
        cbxCategory.SelectedIndex = list.FindIndex(c => c.StartsWith("test"));
0
spajce

Ma 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;
0
Nikolay Zhukov