2009-05-15 12 views
19

Voglio uno ListBox pieno di elementi. Sebbene, ogni articolo dovrebbe avere un valore diverso. Quindi, quando l'utente seleziona un elemento e preme un pulsante, verrà chiamato un metodo che utilizzerà il valore selezionato dall'elemento selezionato.Crea articoli ListBox con un valore diverso rispetto al testo dell'articolo

Non voglio rivelare i valori dell'articolo all'utente.

MODIFICA: Questo non è per ASP.NET, è per un'applicazione Windows Form. Ho solo pensato che l'esempio HTML sarebbe stato facile da leggere.

ho l'ispirazione da HTML:

<form> 
<input type="radio" name="sex" value="Value1" /> Male 
<br /> 
<input type="radio" name="sex" value="Value2" /> Female 
</form> 

Questo mi permette anche di usare valori diversi di quello che l'utente vede.

risposta

30

È possibile scegliere cosa visualizzare utilizzando il DisplayMember del ListBox.

List<SomeData> data = new List<SomeData>(); 
data.Add(new SomeData() { Value = 1, Text= "Some Text"}); 
data.Add(new SomeData() { Value = 2, Text = "Some Other Text"}); 
listBox1.DisplayMember = "Text"; 
listBox1.DataSource = data; 

Quando l'utente seleziona un elemento, è possibile leggere il valore (o qualsiasi altra proprietà) dall'oggetto selezionato:

int value = (listBox1.SelectedItem as SomeData).Value; 

Aggiornamento: notare che DisplayMember funziona solo con le proprietà, non con i campi , quindi è necessario modificare la vostra classe un po ':

public class SomeData 
{ 
    public string Value { get; set; }; 
    public string Text { get; set; }; 
} 
+4

Quando si utilizza DisplayMember, ha più senso impostare ValueMember = "Value" e quindi leggere SelectedValue –

+0

@Henk: +1, sono d'accordo, volevo solo sottolineare che è possibile accedere all'oggetto completo, non solo "pre "assegnato" proprietà. –

+0

Ciao, il tuo codice sembra funzionare, grazie. C'è comunque un piccolo errore. Non visualizzerà la voce Testo nella lista. Scrive Namespace.SomeData .... La parte di valore funziona perfettamente però, grazie! – CasperT

1

oggetti hanno una proprietà chiamata 'tag', che può essere utilizzato per memorizzare tutte le informazioni che si desidera (nascosto all'utente)

ListViewItem myItem = new ListViewItem(); 
myItem.Text = "Users see this"; 
myItem.Tag = "Users don't see this"; 

(o impostare le proprietà appropriate in Esplora proprietà)

+0

Potrebbe mostrare un esempio? ogni articolo ha bisogno del proprio valore individuale – CasperT

+0

La domanda riguarda 'ListBox'. AFAIK, 'ListViewItem' solo sarebbe usato all'interno di un' ListView'. Funzionerebbe per usare 'ListViewItem' in un' ListBox'? – ToolmakerSteve

1

Come affermato dal the 1st answer, l'uso di opere DisplayMember se si sta utilizzando asp.net o winfor Signorina.

E per commentare un po 'di più, funziona anche se si utilizza il modo piuttosto vecchio Items.add di aggiungere elementi a un ListBox.

Solo per divertimento, ecco un semplice demo di quello che vi serve (basta creare un nuovo modulo e rilasciarlo su di esso un ListBox e un Label):

public partial class Form1 : Form 
{ 
    class Customer 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     public override string ToString() 
     { 
      return string.Format("{0} {1}", LastName, FirstName); 
     } 
    } 

    public Form1() { InitializeComponent(); } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e);       
     listBox1.DisplayMember = "LastName";    
     listBox1.DataSource = GetCustomers(); 
     //listBox1.Items.AddRange(GetCustomers().ToArray());    
    } 

    private IEnumerable<Customer> GetCustomers() 
    { 
     return new List<Customer>() 
     { 
      new Customer() { FirstName = "Gustav", LastName = "MAHLER" }, 
      new Customer() { FirstName = "Johann Sebastian", LastName = "BACH" } 
     }; 
    } 

    private void lb_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     label1.Text = listBox1.SelectedItem.ToString(); 
    }   
} 

Godetevi

PS: @2nd postTag non è disponibile per ListBox: perché accetta un array di object, non un contenitore di articoli specifici come ListView ... ma nel tuo caso non ne hai bisogno. Tag è utile quando si desidera trasportare dati aggiuntivi con uno specifico TreeViewItem o ListViewItem per esempio. A proposito, Tag è definito al livello Control e quindi esiste per Button, Label e così via ... ma da parte mia penso che sia piuttosto una cattiva idea archiviare dati aziendali in esso (non codificati, interfaccia utente accoppiata. ..) a parte i casi ListView e TreeView per i quali è piuttosto conveniente.

-1

Facile!

protected void Page_Load(object sender, EventArgs e) 
    { 
     llenaListBox(ListBox1, 0, 10); 
    } 

    private void llenaListBox(ListBox PoListBox, int PiMinimo, int PiMaximo) 
    { 
     int Li; 
     for (Li = PiMinimo; Li <= PiMaximo; Li++) 
     { 
      ListItem obj = new ListItem(); 
      obj.Text = Li.ToString(); 
      obj.Value = Li.ToString(); 
      PoListBox.Items.Add(obj); 
     } 

    } 
+0

La classe 'ListItem' fa parte di' WebControls', non parte di 'Windows Forms', come le richieste di domande. – ToolmakerSteve

3

Molto semplice:

foreach(var item in *Your Source List*) 
     { 
      ListItem dataItem = new ListItem(); 
      dataItem.Text = "value to show"; 
      dataItem.Value = *another value you want*; 
      listBox.Items.Add(dataItem); 
     } 
+0

La classe 'ListItem' fa parte di' WebControls', non parte di 'Windows Forms', come le domande richieste. – ToolmakerSteve

Problemi correlati