2013-03-07 3 views
0

Vu le code suivantcomportement ComboBox inattendu

namespace WindowsFormsApplication1 
{ 
    public class Form1 : Form 
    { 
     public Form1() 
     { 
      comboBox1 = new System.Windows.Forms.ComboBox(); 

      comboBox1.Items.AddRange(new object[] { 
      "Item 1", 
      "Item 2", 
      "Item 3"}); 
      comboBox1.Location = new System.Drawing.Point(93, 103); 
      comboBox1.Name = "comboBox1"; 
      comboBox1.Size = new System.Drawing.Size(121, 21); 
      comboBox1.Text = "Item 1"; // **line 1** 

      ClientSize = new System.Drawing.Size(284, 262); 
      Controls.Add(this.comboBox1); 

      Name = "Form1"; 
      Text = "Form1"; 

      comboBox1.Text = "Nanu"; // **line 2** 
     } 

     private ComboBox comboBox1; 

    } 
} 

J'attendais mon ComboBox pour afficher "Nanu" (DropDownStyle.DropDown), mais il montre "point 1". L'omission de la ligne comboBox1.Text = "Item 1"; résout ce problème. La mise à comboBox1.Text = "Nanu"; dans le gestionnaire d'événements OnShown corrige également le "bug".

Pourquoi est-ce?

+1

ce qui se passe si vous mettez comboBox1.Text = "Nanu"; avant Controls.Add (this.comboBox1) ;? – VladL

+0

Déplacer la ligne 2 ci-dessus Controls.Add résout le problème, mais n'est pas une option réelle car la première partie du programme est générée par le concepteur (méthode "InitializeComponents"), la deuxième partie est exécutée dans le constructeur du formulaire. –

Répondre

2

Selon msdn

Réglage de la propriété Text à null ou une chaîne vide ("") définit la SelectedIndex à -1. Définir la propriété Text à une valeur qui est dans la collection Items définit l'SelectedIndex à l'index de cet élément. La définition de la propriété Text sur une valeur qui n'est pas dans la collection ne modifie pas l'élément SelectedIndex.

Alors, quand vous faites:

comboBox1.Text = "Item 1"; 

Vous sélectionnez automatiquement le « Point 1 » précédemment ajouté dans la liste des articles. Ajouter "Nanu" à la collection et il devrait fonctionner:

comboBox1.Items.AddRange(new object[] { 
    "Item 1", 
    "Item 2", 
    "Item 3", 
    "Nanu"}); 
+0

Nanu est une chaîne entrée par l'utilisateur et chargée dynamiquement dans la forme à partir de la base de données. Il n'est donc pas possible de l'ajouter à la collection Items. Je comprends qu'avec ma ligne 1, SelectedIndex est mis à 0, avec la ligne il est laissé inchangé, mais je ne vois pas pourquoi le contrôle remplace mon texte par "Item 1". –

+0

@MatthiasWuttke combobox ne fonctionne pas comme textbox, la propriété Text dans combobox fonctionne comme SelectedItem, Donc, lorsque vous définissez le texte à une chaîne qui n'existe pas dans la collection, le dernier élément sélectionné sera toujours là - d'où "item 1". Je ne vois pas pourquoi il n'est pas possible d'ajouter "Nanu" plus tard? Il suffit de l'ajouter comme ceci 'combobox1.Items.Add (" Nanu ");' – AbZy

+0

Vous avez raison, en ajoutant "Nanu" comme un élément aide. Mais: Si je définis la propriété Text dans le gestionnaire d'événement OnShown, cela fonctionne sans problème, tandis que la définition de la propriété Text dans le constructeur échoue. Cela me semble étrange - peut-être que les initialisations internes arrivent plus tard? –