2009-02-03 8 views
6

Sto scrivendo un'app winforms in cui un utente seleziona un elemento da una casella di riepilogo e modifica alcuni dati che fanno parte di un oggetto associato. Le modifiche vengono quindi applicate dall'elenco degli oggetti a un file sottostante.Come si ottiene la "chiave" dell'elemento della casella di riepilogo nell'app di winforms C#?

In ASP.Net assegnare un valore di sistema diverso a una voce di elenco rispetto al testo visualizzato che l'utente vede è banale. In un'app winforms è necessario impostare "Displaymember" e "Valuemember" di ciascun elemento in un processo leggermente più complicato (e non spesso correlato su Internet).

Questo ho fatto. In modalità debug ho confermato che ogni elemento ora ha un valore che è il membro di visualizzazione (una stringa "amichevole" che l'utente vede) e una chiave, il valore, che detiene la chiave per un oggetto hashtable in cui i dati devono essere aggiornati esiste.

Quindi, quando un utente sceglie una stringa per modificare il programma deve passare la "chiave" alla tabella hash, estrarre l'oggetto e consentire la modifica su di esso.

Il fermo?

Non riesco a vedere alcun modo ovvio di dire al programma di guardare il valore del prodotto. Mi aspettavo ingenuamente che compilasse la proprietà "SelectedValue" della casella di riepilogo, ma sarebbe troppo semplice. Quindi come diavolo arrivo al valore della lista?

risposta

4

Okay, la risposta è arrivata come risultato della risposta di Andy, da cui la mia risposta è stata quella di upvoting.

Ma quando ho creato una piccola classe e ho provato a trasmettere il listitem in quella classe, il programma ha generato un'eccezione.

In modo rivelatore l'eccezione mi ha detto che il programma non poteva lanciare un DictionaryEntry in una classe del tipo che avevo definito.

Così ho cancellato la classe proxy e riformulata la richiesta in tal modo:

DictionaryEntry de = (DictionaryEntry)listbox.SelectedItem;
string htKey = de.Key.ToString();

ed è tutto buono.

Alla fine una risposta bizzarramente semplice. Grazie per il suggerimento Andy.

1

Prova ad afferrare il "ValueMember" dall'interno dell'evento ListBox1_SelectedValueChanged.

private void ListBox1_SelectedValueChanged(object sender, EventArgs e) 
{ 
    if (ListBox1.SelectedIndex != -1) 
    { 
     string orbit = ListBox1.SelectedValue.ToString(); 
    } 
} 

ArrayList planets = new ArrayList(); 
planets.Add(new Planet("Mercury", "1")); 
planets.Add(new Planet("Venus", "2")); 

//Remember to set the Datasource 
ListBox1.DataSource = planets; 
//Name and Orbit are properties of the 'Planet' class 
ListBox1.DisplayMember = "Name"; 
ListBox1.ValueMember = "Orbit"; 
5

Utilizzando sia la SelectedIndexChanged e SelectedValueChanged non ha funzionato per me - la proprietà ListBox'sSelectedValue era sempre nullo. Questo ha sorpreso anche me.

Per risolvere il problema zoppo, si può solo tirare l'oggetto fuori dal ListBox direttamente, utilizzando il SelectedIndex:

public Form1() 
{ 
    InitializeComponent(); 

    this.listBox1.DisplayMember = "Name"; 
    this.listBox1.ValueMember = "ID"; 

    this.listBox1.Items.Add(new Test(1, "A")); 
    this.listBox1.Items.Add(new Test(2, "B")); 
    this.listBox1.Items.Add(new Test(3, "C")); 
    this.listBox1.Items.Add(new Test(4, "D")); 
    this.listBox1.Items.Add(new Test(5, "E")); 
} 

private void OnSelectedIndexChanged(object sender, EventArgs e) 
{ 
    if(-1 != this.listBox1.SelectedIndex) 
    { 
     Test t = this.listBox1.Items[this.listBox1.SelectedIndex] as Test; 
     if(null != t) 
     { 
      this.textBox1.Text = t.Name; 
     } 
    } 
} 

(Test è solo una semplice classe con due proprietà - ID e Name).

Sembra che ci dovrebbe essere un modo migliore, ma se non altro dovrebbe funzionare.

+0

Hai impostato la proprietà DataSource? – Phaedrus

+0

Non l'ho fatto, ma stavo solo cercando di mettere insieme un rapido campione. Supponevo (erroneamente?) Che il valore Selected fosse impostato indipendentemente da dove provenissero i dati. – Andy

0

hehehe Ho finito qui mentre stavo cercando come ottenere il valore di un oggetto in ListBox, poi mi è venuto in mente l'ovvio. Il segreto è che metodo Item in C#, VB e gli altri è un array, in modo da ottenere un valore di qualsiasi voce devi solo scrivere questo:

ListBox1.Items[1].toString();//Get value of the #1 Item in the ListBox; 

per ottenere tutti gli elementi e messo in un documento o a una stringa, basta fare una simile in questo modo:

String Value; 
for(int c=0;c<ListBox1.Items.Count;c++){ 
Value = Value + ListBox1.Items[c].toString(); 
} 
//Thats it 

Spero di averti aiutato fuori. Questa è la risposta più semplice al tuo post.

2

So che questo è un post molto vecchio, ma non sono riuscito a trasmettere gli elementi della mia lista in un elemento di dizionario. Questa soluzione ha funzionato per me in .NET 3.5 per i moduli di Windows.

KeyValuePair<int, string> kvp = (KeyValuePair<int, string>)listBoxSystems.SelectedItem; 
string szValue = kvp.Value; 
0

Un modo semplice e pulito:

Aggiungi elemento (includere chiave e il valore) per ListBox:

lsbListBoxName.Items.Insert(0, New ListItem("Item 1", 1)) 
lsbListBoxName.Items.Insert(0, New ListItem("Item 2", 2)) 
... 


ottenete l'articolo sulla selezione dell'utente:

Private Sub lsbListBoxName_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lsbListBoxName.SelectedIndexChanged 
    Console.WriteLine(TryCast(lsbListBoxName.SelectedItem, ListItem).Text) 
    Console.WriteLine(TryCast(lsbListBoxName.SelectedItem, ListItem).Value) 
End Sub 

il lsbListBoxName è il nome di ListBox e il codice è VB.NET è possibile utilizzare This Online Tool per convocare in C#.

Problemi correlati