2010-10-03 6 views
2

Est-il possible de créer une zone de liste déroulante Windows Forms en lecture seule? Pour être précis: l'utilisateur devrait pouvoir taper, mais seulement les valeurs dans la boîte devraient être permises (utilisant l'auto-complétion ou un select de la liste). Ou est le seul moyen d'utiliser l'événement de validation?Zone de liste déroulante Windows Forms en lecture seule

Cordialement

Mario

Répondre

3

Vous pouvez régler la DropDownStyle à DropDownList, mais cela ne permet pas vraiment taper (mais il ne permet la sélection avec le clavier).

Si vous voulez que l'utilisateur puisse taper/voir des mots incomplets, vous devrez utiliser un événement. L'événement de validation serait le meilleur choix.

+0

Merci! Je voulais juste que je puisse le faire sans le coder moi-même ... Devinez un autre composant de la bibliothèque pour mon set ... –

3

Si vous définissez AutoCompleteMode = SuggestAppend et AutoCompleteSource = ListItems lorsqu'un utilisateur saisit quelque chose, la zone de liste déroulante affiche automatiquement les entrées qui commencent par les caractères saisis.

Ensuite, en gérant les événements SelectedIndexChanged ou SelectedValueChanged, vous pourrez intercepter lorsqu'un utilisateur tape exactement une valeur présente dans la liste des valeurs.

Si vous aussi ne voulez absolument pas à l'utilisateur de taper quelque chose qui ne figure pas dans la liste, eh bien oui, vous devez gérer par exemple l'événement KeyDown comme:

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    char ch = (char)e.KeyValue; 
    if (!char.IsControl(ch)) 
    { 
     string newTxt = this.comboBox1.Text + ch; 
     bool found = false; 
     foreach (var item in this.comboBox1.Items) 
     { 
      string itemString = item.ToString(); 
      if (itemString.StartsWith(newTxt, StringComparison.CurrentCultureIgnoreCase)) 
      { 
       found = true; 
       break; 
      } 
     } 
     if (!found) 
      e.SuppressKeyPress = true; 
    } 
} 
+0

Merci, j'avais peur de devoir faire ça! –

0

Merci. la méthode ci-dessus fonctionne pour moi sauf le code d'événement KeyDown. Parce que la liste déroulante est attachée à un DataTable. Essayez le code ci-dessous si combobox est attaché à un DataTable et si vous ne voulez absolument pas que l'utilisateur tape quoi que ce soit qui ne soit pas dans la liste.

private void cmbCountry_KeyDown(object sender, KeyEventArgs e) 
    { 
     char ch = (char)e.KeyValue; 
     if (!char.IsControl(ch)) 
     { 
      string newTxt = this.cmbCountry.Text + ch; 
      bool found = false; 
      foreach (var item in cmbCountry.Items) 
      { 
       DataRowView row = item as DataRowView; 
       if (row != null) 
       { 
        string itemString = row.Row.ItemArray[0].ToString(); 
        if (itemString.StartsWith(newTxt,  StringComparison.CurrentCultureIgnoreCase)) 
        { 
         found = true; 
         break; 
        } 
       } 
       else 
        e.SuppressKeyPress = true; 
      } 
      if (!found) 
       e.SuppressKeyPress = true; 
     } 
    } 
Questions connexes