2009-05-15 15 views
19

Quiero un ListBox lleno de elementos. Aunque, cada elemento debe tener un valor diferente. Entonces, cuando el usuario selecciona un elemento y presiona un botón, se llamará a un método que utilizará el valor que tiene el elemento seleccionado.Hacer que los elementos de ListBox tengan un valor diferente que el texto del elemento

No deseo revelar los valores del artículo al usuario.

EDITAR: Esto no es para ASP.NET, es para una aplicación de Windows Forms. Solo pensé que el ejemplo HTML sería fácil de leer.

que tienen la inspiración de HTML:

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

Esto también me permite usar valores diferentes de lo que el usuario ve.

Respuesta

30

Puede elegir qué mostrar usando el 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; 

Cuando el usuario selecciona un elemento, se puede leer el valor (o cualquier otra propiedad) del objeto seleccionado:

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

Actualización: tenga en cuenta que DisplayMember sólo funciona con propiedades, no con campos , por lo que necesita para cambiar su clase un poco:

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

Al usar DisplayMember, tiene más sentido configurar ValueMember = "Value" y luego leer SelectedValue –

+0

@Henk: +1, estoy de acuerdo, solo quería señalar que puede obtener acceso al objeto completo, no solo "pre propiedades "asignadas". –

+0

Hola, tu código parece funcionar, gracias. Sin embargo, hay un error menor. No mostrará el elemento Texto en el cuadro de lista. Escribe Namespace.SomeData .... La parte del valor funciona perfectamente, ¡gracias! – CasperT

1

artículos tienen una propiedad llamada 'Tag', que se puede utilizar para almacenar cualquier información que desee (oculta para el usuario)

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

(o establecer las propiedades adecuadas en el explorador de la propiedad)

+0

Podría mostrar un ejemplo? cada elemento necesita su propio valor individual – CasperT

+0

La pregunta es sobre 'ListBox'. AFAIK, 'ListViewItem' solo se usaría dentro de' ListView'. ¿Funcionaría usar 'ListViewItem' en un' ListBox'? – ToolmakerSteve

1

según lo indicado por the 1st answer, el uso de DisplayMember obras de si está utilizando asp.net o winfor Sra.

Y para comentar un poco más, también funciona si está utilizando la forma más antigua de la moda Items.add manera de agregar elementos a un ListBox.

Sólo por diversión, aquí es una simple demostración de lo que necesita (basta con crear una nueva forma y colocar en ella un cuadro de lista y una etiqueta):

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(); 
    }   
} 

Disfrute

PS: @2nd postTag no está disponible para ListBox: porque acepta una matriz de object, no un contenedor de elementos específicos como ListView ... pero no necesita ninguno en su caso. Tag es útil cuando desea transportar datos adicionales junto con un TreeViewItem específico o ListViewItem por ejemplo. Por cierto, Tag se define en el nivel Control y existe para Button, Label, y así sucesivamente ... pero por mi parte, creo que es una mala idea almacenar datos comerciales en ella (sin tipo, UI acoplado). ..) aparte de los casos ListView y TreeView para los cuales es bastante conveniente.

-1

¡Fácil!

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 clase 'ListItem' es parte de' WebControls', no es parte de 'Windows Forms', como la pregunta lo solicita. – ToolmakerSteve

3

muy simple:

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 clase 'ListItem' es parte de' WebControls', no es parte de 'Windows Forms', como la pregunta lo solicita. – ToolmakerSteve

Cuestiones relacionadas