SelectedItem dei ComboBox

venerdì 08 luglio 2005 - 16.49

ysdemarc Profilo | Expert

Riempio delle ComboBox con oggetti (e alcuni di essi incorporano anche altri oggetti).

Questi hanno tuttli il loro metodoo ovverride ToString()
e nella combo vengono visualizzati perfettamente.

Se leggo la selezione non c'è problema mentre il problema sta nel selezionare il valore da codice.
Infatti dicendogli myCombo.SelectedItem = myObj non seleziona nulla.
Nel vericùficare ho fatto anche myCombo.Items.Contains(myObj) e restituisce false.

In debug ho stampato visualizzato i valori contenuti sia dall'oggetto contenuto in combo ce quelli di myObj e sono spiccicati identici.
Perchè allora non mi seleziona il valore?

:-((

ciao!

Han Profilo | Newbie

Ammesso che tu voglia salvare in una variabile il valore della combobox selezionato dall'utente io (in VB ma dovrebbe essere lo stesso) quando ho avuto lo stesso problema ho cambiato l'opzione "selecteditem" con il più classico "text", come fosse un textbox.

es.
x = combobox1.selecteditem

è diventato

x = combobox1.text()

Vedi se funziona :)

ysdemarc Profilo | Expert

Ciao Han...

Io non voglio prendere solo il testo della combo ma l'intero oggetto.

Adesso visualizzando tutti i valori dei campi di entrambi gli oggetti (quello contenuto in combo e quello che mi serve a selezionarlo) i valori sono identici.

Non capisco perchè non lo trova infatti anche la Conteins restituisce false.

per adesso, con una classe di utility, ho risolto così, ma la cosa mi è poco gradevole:

public static void SelectedIndex(ComboBox cmb, object obj)
{
string lockMethod = "lock";
lock(lockMethod)
{
bool esci = false;
if (obj != null)
{
if (cmb.Items.Contains(obj))
{
cmb.SelectedItem = obj;
}
else
{
for (int i=0; i < cmb.Items.Count && !esci; i++)
{
if (cmb.Items[i].ToString().Equals(obj.ToString()))
{
cmb.SelectedIndex = i;
esci = true;
}
} // next
}
}
} // end lock
}


il risultato è giusto ma ho i miei dubbi che questo metodo sia performante in caso di liste piuttosto lunghe.

vedremo...

ciao

Vincenzo
Programmatore sbilenco :-D

franx_dj Profilo | Newbie

Ciao, non so se ho capito bene, ma io ho provato il codice segg e funziona perfettamente...
Sei sicuro che l'oggetto che provi ad assegnare a SelectedItem sia proprio quello che avevi aggiunto alla combo?



----------------

namespace TestComboCS
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ComboBox comboBox1;

[...]

private void Form1_Load(object sender, System.EventArgs e)
{
MyItem []items = new MyItem[3];
items[0] = new MyItem("Obj_1", "Valore 1");
items[1] = new MyItem("Obj_2", "Valore 2");
items[2] = new MyItem("Obj_3", "Valore 3");
this.comboBox1.Items.AddRange(items);
this.comboBox1.SelectedItem=items[1];
}


}

class MyItem
{
public string Nome;
public string Valore;

public MyItem(string _nome, string _valore) {
Nome = _nome;
Valore = _valore;
}

public override string ToString() {
return Valore;
}
}

}


by franx_dj

ysdemarc Profilo | Expert

Ciao...

Il pgm funziona così:

Inizialemente carico la mia combo.. tutto va bene e se seleziono un vùcampo della combo e faccio mil cast dell'oggetto mi restituisce il tutto perfettamente.

Durante però l'ìinterfacciamento con l'utente mi occore selezionare un valore differente nella combo.

L'oggetto da usare con la SelectedItem viene però creato solo per l'occasione e anche se questo oggetto come valori è identico a quello contenuto nella combo questi non viene selezionato poichè per lui non esiste all'inteno dell'oggetto combobox (Contains di combo restituisce false).

Il, motivo non riesco a capirlo. Forse è lì'istanza dell'oggetto che è diversa e quindi per lui due oggetti anche se ugauli nei valori sono differenti.

ciao

Vincenzo
Programmatore sbilenco :-D

ysdemarc Profilo | Expert

provando il codice da te postato io ho lo stesso preblema.

Infatti se in un button metto il seguente codice non viene selezionato nulla:

MyItem i = new MyItem("Obj_2", "Valore 2");
this.comboBox1.SelectedItem=i;

anche se effettivamente in Load un oggetto coi valori identici a questo esiste.



Vincenzo
Programmatore sbilenco :-D

franx_dj Profilo | Newbie

Correggimi se sbaglio: tu fai così:
a) crei un oggetto e lo aggiungi alla combo;
b) in seguito crei un oggetto uguale e cerchi di usarlo per la selezione;

Se è così allora non ci riuscirai mai. Il secondo oggetto è un oggetto con valori uguali, ma non è la stessa entità di oggetto. Quindi giustamente la contains ti da false!

Devi usare un riferimento allo stesso oggetto, cioè quello creato dalla prima new.
Gli oggetti di cui hai fatto la add alla combo potresti salvarli in un array o in una hashtable, e poi utilizzare quelli.

by franx_dj

ysdemarc Profilo | Expert

Esatto, proprio quello che faccio.

Proverò a fare come dici.

Grazie mille.

Ciao!

Vincenzo
Programmatore sbilenco :-D
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5