Come faccio a impostare l'elemento selezionato in una casella combinata in modo che corrisponda alla mia stringa usando C #?


197

Ho una stringa "test1" e il mio comboBox contiene test1, test2e test3. Come posso impostare l'elemento selezionato su "test1"? Cioè, come posso abbinare la mia stringa a uno degli elementi comboBox?

Stavo pensando alla riga in basso, ma questo non funziona.

comboBox1.SelectedText = "test1"; 

come non funziona? Cosa succede quando viene eseguita questa riga di codice?
Kate Gregory,

@KateGregory concatena la stringa "test1" al testo esistente
solujic

Se hai modo di conoscere il valore dell'articolo puoi usare: comboBox1.SelectedValue = Value_of_your_string;
César León,

SelectedTextcambia il testo "Selezionato" in test1. se non viene effettuata alcuna "Selezione" (testo contrassegnato), il testo verrà inserito nella posizione del cursore.
AaA

Risposte:


278

Questo dovrebbe fare il trucco:

Combox1.SelectedIndex = Combox1.FindStringExact("test1")

Mi sembra una risposta migliore perché hai un valore di ritorno che puoi salvare temporaneamente in una variabile e usarlo per testare se hai trovato il valore che stavi cercando.
Áxel Costas Pena,

cosa succede se ci sono più di un valore "test1" in combox1
thoitbk

@thoitbk: in base a MSDN all'indirizzo msdn.microsoft.com/en-us/library/… , il metodo FindStringExact() "Trova il primo elemento nella casella combinata che corrisponde alla stringa specificata."
dub stylee,

207

Hai provato la proprietà Text ? Per me funziona.

ComboBox1.Text = "test1";

La proprietà SelectedText è per la parte selezionata del testo modificabile nella parte della casella di testo della casella combinata.


7
Sicuramente questo imposta semplicemente il testo nell'area modificabile di ComboBox anziché selezionare l'elemento rilevante dall'elenco? Se la raccolta di elementi dell'elenco contiene oggetti anziché solo stringhe, quindi dubito che questo selezionerebbe l'oggetto ListItem appropriato, piuttosto imposterebbe semplicemente la proprietà Text sul ComboBox?
TabbyCool

9
Imposta la proprietà SelectedValue del controllo
Henryk

Bello. Funziona magnificamente per dimensioni del carattere, peso e pulldown della famiglia. Nessun cast o conversione tra le classi. Davvero molto più facile!
Lance Cleveland,

3
Per ogni evenienza: questo parametro deve essere impostato solo dopo aver popolato la casella combinata.
Antoine Rodriguez,

12
Il mio stile a discesa della casella combinata è DropDownList e .Text = "un po 'di testo" non funziona. Questa soluzione ha funzionato bene per me: Combox1.SelectedIndex = Combox1.FindStringExact ("test1")
Mayank

48

Supponendo che la casella combinata non sia un database, è necessario trovare l'indice dell'oggetto nella raccolta "items" sul modulo e quindi impostare la proprietà "selectedindex" sull'indice appropriato.

comboBox1.SelectedIndex = comboBox1.Items.IndexOf("test1");

Tieni presente che la funzione IndexOf può generare un'argumentexception se l'elemento non viene trovato.


1
Ricorda SelectedINDEX non SelectedITEM ... E il compilatore non si lamenterà, non riuscirà a impostare il valore della casella combinata
Rob

Non ti piacciono gli errori logici che non generano alcuna eccezione, semplicemente non funzionano ...
Spence

questo sta selezionando l'elemento, ma non chiamando l'evento onChange sulla casella combinata
mrid

39

Se gli elementi in ComboBox sono stringhe, puoi provare:

comboBox1.SelectedItem = "test1";


Salvato il giorno! L'articolo selezionato deve corrispondere al tipo: era quello che faceva per me! Mi stavo grattando la testa perché l'oggetto selezionato non era impostato anche se l'oggetto era chiaramente lì - si è rivelato essere un tipo non corrispondente!
Sudhanshu Mishra,

Per completezza, utile per avere la descrizione dal link sopra, soprattutto perché questa risposta esegue il controllo di corrispondenza suggerito da altre risposte tra cui quella preferita di @norbertB: quando si imposta la proprietà SelectedItem su un oggetto, ComboBox tenta di creare quell'oggetto quello attualmente selezionato nell'elenco. Se l'oggetto viene trovato nell'elenco , viene visualizzato nella parte di modifica di ComboBox e la proprietà SelectedIndex è impostata sull'indice corrispondente. Se l'oggetto non esiste nell'elenco, la proprietà SelectedIndex viene lasciata al suo valore corrente.
DanG

10

Per me questo ha funzionato solo:

foreach (ComboBoxItem cbi in someComboBox.Items)
{
    if (cbi.Content as String == "sometextIntheComboBox")
    {
        someComboBox.SelectedItem = cbi;
        break;
    }
}

MOD: e se hai i tuoi oggetti come elementi impostati nella casella combinata, sostituisci ComboBoxItem con uno di questi come:

foreach (Debitor d in debitorCombo.Items)
{
    if (d.Name == "Chuck Norris")
    {
        debitorCombo.SelectedItem = d;
        break;
    }
}

2
Questo ha funzionato per me, ma devi stare attento che gli elementi nel tuo ComboBox sono in realtà ComboBoxItems in quanto è possibile inserire anche altri elementi.
Concedi il

Questo ha funzionato alla grande in WinRT 8.1. In realtà ho racchiuso il foreach superiore in un metodo di estensione come ha scritto Dave nella sua soluzione SelectItemByValue (), ed è stata davvero la soluzione perfetta.
Speednet,

9

SelectedText consiste nell'ottenere o impostare il testo effettivo nell'editor di stringhe per l'elemento selezionato nella casella combinata come documentato qui . Questo diventa non modificabile se imposti:

comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;

Uso:

comboBox1.SelectedItem = "test1";

o:

comboBox1.SelectedIndex = comboBox1.Items.IndexOf("test1");

1
comboBox1.Items.IndexOf ... rischia un'eccezione NullReferenceException se gli elementi sono vuoti.
Gary,

9
ComboBox1.SelectedIndex= ComboBox1.FindString("Matching String");

Prova questo in Windows Form.


7

Ho usato un metodo di estensione:

public static void SelectItemByValue(this ComboBox cbo, string value)
{
    for(int i=0; i < cbo.Items.Count; i++)
    {
        var prop = cbo.Items[i].GetType().GetProperty(cbo.ValueMember);
        if (prop!=null && prop.GetValue(cbo.Items[i], null).ToString() == value)
        {
             cbo.SelectedIndex = i;
             break;
        }
    } 
}

Quindi basta usare il metodo:

ddl.SelectItemByValue(value);

5
comboBox1.SelectedItem.Text = "test1";


4

Questa soluzione si basa su MSDN con alcune modifiche che ho apportato.

  • Trova l'esatto o PARTE della stringa e la imposta.

    private int lastMatch = 0;
    private void textBoxSearch_TextChanged(object sender, EventArgs e)
    {
        // Set our intial index variable to -1.
        int x = 0;
        string match = textBoxSearch.Text;
        // If the search string is empty set to begining of textBox
        if (textBoxSearch.Text.Length != 0)
        {
            bool found = true;
            while (found)
            {
                if (comboBoxSelect.Items.Count == x)
                {
                    comboBoxSelect.SelectedIndex = lastMatch;
                    found = false;
                }
                else
                {
                    comboBoxSelect.SelectedIndex = x;
                    match = comboBoxSelect.SelectedValue.ToString();
                    if (match.Contains(textBoxSearch.Text))
                    {
                        lastMatch = x;
                        found = false;
                    }
                    x++;
                }
            }
        }
        else
            comboBoxSelect.SelectedIndex = 0;
    }

Spero di aver aiutato!


3

Ho riempito il mio ComboBox con una DataTable riempita da un database. Quindi ho impostato DisplayMember e ValueMember. E io uso questo codice per impostare l'elemento selezionato.

foreach (DataRowView Row in ComboBox1.Items)
{
    if (Row["ColumnName"].ToString() == "Value") ComboBox1.SelectedItem = Row;
}

1

Non hai quella proprietà nel ComboBox. Hai SelectedItem o SelectedIndex. Se si dispone degli oggetti utilizzati per riempire la casella combinata, è possibile utilizzare SelectedItem.

In caso contrario, è possibile ottenere la raccolta di elementi (elementi di proprietà) e iterarli fino a ottenere il valore desiderato e utilizzarlo con le altre proprietà.

spero che sia d'aiuto.


1
_cmbTemplates.SelectedText = "test1"

o forse

_cmbTemplates.SelectedItem= _cmbTemplates.Items.Equals("test1");

con questo codice, si assegna un bool alla proprietà SelectedItem ... non funzionerà imho.
Frederik Gheysels,

1
  • Enumera ListItems nella casella combinata
  • Ottieni la stessa casella combinata listindex set
  • Imposta listindex su quello trovato.

Ma se vedo un codice come un revisore del codice, consiglierei di riconsiderare tutto l'algoritmo del metodo.


2
Perché l'hai fornita come risposta allora?

1

Ho usato KeyValuePair per il bind di dati ComboBox e volevo trovare l'oggetto per valore, quindi nel mio caso ha funzionato:

comboBox.SelectedItem = comboBox.Items.Cast<KeyValuePair<string,string>>().First(item=> item.Value == "value to match");

1

Trova mySecondObject (di tipo MyObject) nella casella combinata (contenente un elenco di MyObjects) e seleziona l'elemento:

foreach (MyObject item in comboBox.Items)
{
   if (item.NameOrID == mySecondObject.NameOrID)
    {
        comboBox.SelectedItem = item;
        break;
    }
}

0
  ListItem li = DropDownList.Items.FindByValue("13001");
  DropDownList.SelectedIndex = ddlCostCenter.Items.IndexOf(li);

Per il tuo caso puoi usare

DropDownList.Items.FindByText("Text");

0
combo.Items.FindByValue("1").Selected = true;

3
Ciò comporta anche un'eccezione se non viene trovato "1".
Gary,

0

Tutti i metodi, i trucchi e le righe di codice che impostano l'elemento ComboBox non funzioneranno finché ComboBox non ha un genitore.


0

Ho creato una funzione che restituirà l'indice del valore

        public static int SelectByValue(ComboBox comboBox, string value)
        {
            int i = 0;
            for (i = 0; i <= comboBox.Items.Count - 1; i++)
            {
                DataRowView cb;
                cb = (DataRowView)comboBox.Items[i];
                if (cb.Row.ItemArray[0].ToString() == value)// Change the 0 index if your want to Select by Text as 1 Index
                {
                    return i;
                }
            }
            return -1;
        }

0

questo funziona per me .....

comboBox.DataSource.To<DataTable>().Select(" valueMember = '" + valueToBeSelected + "'")[0]["DislplayMember"];

1
Sebbene questo codice possa rispondere alla domanda, è meglio spiegare come risolvere il problema e fornire il codice come esempio o riferimento. Le risposte di solo codice possono essere confuse e prive di contesto.
Robert Columbia,

Grazie per il consiglio!
Jaydeep Karena,


-2

Per favore prova così, funziona per me:

Combobox1.items[Combobox1.selectedIndex] = "replaced text";

Si dovrebbe verificare che selectedIndex non sia -1 per primo, o più precisamente che sia> = 0 e <.items.length.
Gary,

-3

Dovrebbe funzionare

Yourcomboboxname.setselecteditem("yourstring");

E se vuoi impostare una stringa di database usa questo

Comboboxname.setselecteditem(ps.get string("databasestring"));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.