C sharp - Ayuda con ComboBox

 
Vista:

Ayuda con ComboBox

Publicado por SoloLaPuntita (4 intervenciones) el 17/07/2019 07:45:06
No sé la como rescatar un dato del SelectedItem
En este caso, el valor del campo Dato2

Id es el ValueMember
Nombre es el Display Member
Dato2 es el valor que deseo recuperar y no sé como hacerlo.

Alguna idea..???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var r = from x in db.Centro
    select new
    {
        x.id,
        x.Nombre,
        x.Dato1,
        x.Dato2,
        x.Dato3
    };
cbCentro.DisplayMember = "Nombre";
cbCentro.ValueMember = "id";
cbCentro.DataSource = r.ToList();
 
 
private void cbCentro_SelectedIndexChanged(object sender, EventArgs e) {
 
    //Esto no me funciona, No sé como se hace..???
    string auxDato2 = cbCentro.SelectedItem["Dato2"];
 
 
}


Muchas gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Ayuda con ComboBox

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 17/07/2019 19:08:54
Eso es tan simple como esto:

var dato=cboCentro.SelectedItem as Centro;

MessageBox.Show(dato.Dato2);


Funciona así siempre y cuando tengas una clase llamada Centro, con todas esas propiedades.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con ComboBox

Publicado por sololapuntita69 (4 intervenciones) el 17/07/2019 22:02:03
Muchas gracias por la ayuda, sin embargo al parecer no es la solución.

El cbCentro.SelectedItem me entrega esta información :

{ id = 43, Nombre = "CENTRO PRUEBA", Dato1 = "01", Dato2 = "080", Dato3 = "20" }
id: 43
Nombre: "CENTRO PRUEBA"
Dato1: "01"
Dato2: "080"
Dato3: "20"



El cbCentro.SelectedItem.GetType() me indica que es ..."anonymous"..??
{Name = "<>f__AnonymousType0`3" FullName = "<>f__AnonymousType0`3[[System.Int16, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int16, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

El ejemplo que me has dado, "dato" siempre queda null

Gracias, saludos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Ayuda con ComboBox

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 17/07/2019 22:08:31
El asunto no es que no sea la solución, por eso te dije, que eso funciona siempre y cuando tengas una clase llamada Centro que incluya esas propiedades, ya que lo que recibe el combobox en su origen de datos es una lista de centros, con eso se castea a ese tipo de dato, al ser anónimo, no tienes como castearlo y solo podrás capturar el id y el nombre, los demás tendrías que buscarlo dentro de un objeto o meterle reflection pero la cosa se vuelve mas pesado para algo tan simple.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 326
Plata
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Ayuda con ComboBox

Publicado por miguelZ (143 intervenciones) el 17/07/2019 22:19:50
Primero sugiero que cambies tu alias por algo mas profesional, solola... suena bastante vulgar y
este sitio es profesional o para gente que quiera serlo, (no es personal solo tomate mas en serio tu profesion).


Ahora como dice Wilfredo debes agregar una clase centro a tu solucion asi el cast sera correcto.

1
var dato=cboCentro.SelectedItem as Centro;

esta es la clase que debes agregar a tu proyecto

1
2
3
4
5
6
7
8
9
public class Centro
{
 
    public int id { get; set;}
    public string  Nombre { get; set;}
    public string  Dato1 { get; set;}
    public string Dato2 { get; set;}
    public string      Dato3  { get; set;}
}


Nota: sugiero que le des una leida a objetos anonimos y como hacer un cast. Poco a poco iras avanzando no desesperes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con ComboBox

Publicado por Francisco Javier (4 intervenciones) el 18/07/2019 05:02:07
Tienes razón, es un tanto vulgar, solo es costumbre.

De todas formas no es un problema de la clase, que ya de por si viene implícita, a través de code first del ADO.net entity., igual hice la clase que sugeriste, con idénticas propiedades y aún así deja los valores como nulos.

Algo había leído de la reflection que menciona Wilfredo, pero no encontré ejemplos de hacerlo y leí que no recomendado.

Alguna idea de como se debería hacer...???



Muchas gracias.,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 326
Plata
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Ayuda con ComboBox

Publicado por miguelZ (143 intervenciones) el 18/07/2019 15:46:45
ya tienes el objeto y sus propiedades.

{ id = 43, Nombre = "CENTRO PRUEBA", Dato1 = "01", Dato2 = "080", Dato3 = "20" }

por lo tanto

despues de
var dato=cboCentro.SelectedItem ;

//creas un nuevo objeto centro

var centroSeleccionado= new Centro(){id=dato.id,Nombre=dato.Nombre, Dato1=dato.Dato1, Dato2=dato.Dato2, Dato3=dato.Dato3};
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier
Val: 96
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Ayuda con ComboBox

Publicado por Javier (40 intervenciones) el 18/07/2019 21:33:53
Cuando tomas el valor de tu combo (SelectedItem ) obtienes el ID (ValueMember), por lo que en el evento "cbCentro_SelectedIndexChanged" tendrías que recorrer la lista original, con la que cargaste el combo y obtener los valores que necesitas, en este caso Dato2, no se si me explique correctamente.

Podrias declaras tu lista como global, la cargas cuando lo necesites y el evento del combo la consultas para obtener los datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
List<Centro> Tulista = new List<Centro>();
 
Evento donde cargas tu combo()
{
   Tulista  = db.Centro.ToList();
 
   cbCentro.DisplayMember = "Nombre";
   cbCentro.ValueMember = "id";
   cbCentro.DataSource = Tulista;
 
}
 
private void cbCentro_SelectedIndexChanged(object sender, EventArgs e)
{
     Aquí declaras una variable tipo "Centro" y haces el recorrido de Tulista cuando el Id sea igual al seleccionado en el combo
 
    string auxDato2 = tuvariable.Dato2;
}


Algo así seria la idea, creo algo así es lo que necesitarías hacer, o bien también podrías hacer la consulta de nuevo con el Id seleccionado pero si ya tienes tu lista esto estaría de mas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con ComboBox

Publicado por Francisco Javier (4 intervenciones) el 19/07/2019 07:30:42
Muchisimas gracias por sus ayuda..

Al final encontré la solución que me funciono y es esta :

1
2
3
4
5
6
private void cbCentro_SelectedIndexChanged(object sender, EventArgs e) {
 
    var dato = cbCentro.SelectedItem;
    string auxDato2 = dato.GetType().GetProperty("Dato2").GetValue(dato, null).ToString();
 
}

La tomé de este lado :
http://aspboss.blogspot.com/2012/04/how-can-i-get-value-of-property-from.html


Nuevamente, muchas gracias..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Ayuda con ComboBox

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 19/07/2019 11:24:12
Justamente estás haciendo reflection, lo que dije que sería mas pesado. Siempre podemos evaluar otras alternativas antes de optar por algo que aparentemente nos resuelve el problema pero no sabemos a que costo.

Además de esa solución, si luego te surge la necesidad de obtener otro campo o dato, tendrías que volver a hacer reflection para otro campo, en cambio con lo que te propongo, puedes obtener los datos completos de la lista reducida.


Te propongo que evalúes la siguiente situación:

Digamos que tienes tu clase principal, la que consultas desde la base de datos y tenga esta estructura:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CentroFull
{
    public int ID { get; set; }
    public string Nombre { get; set; }
    public string Dato1 { get; set; }
    public string Dato2 { get; set; }
    public string Dato3 { get; set; }
    public string Dato4 { get; set; }
    public string Dato5 { get; set; }
    public string Dato6 { get; set; }
    public decimal Precio { get; set; }
    public decimal Importe { get; set; }
    public int Cantidad { get; set; }
    public string Ciudad { get; set; }
    public CentroFull()
    {
 
    }
}

Adicional a esa clase tienes esta:


1
2
3
4
5
6
7
8
9
10
11
12
13
public class Centro
{
    public int ID { get; set; }
    public string Nombre { get; set; }
    public string Dato1 { get; set; }
    public string Dato2 { get; set; }
    public string Dato3 { get; set; }
 
    public Centro()
    {
 
    }
}


Realizas tu consulta, que te devolverá una lista de la clase CentroFull justo como lo tienes

1
2
3
4
5
6
7
8
9
var r = from x in db.Centro
select new
{
    x.id,
    x.Nombre,
    x.Dato1,
    x.Dato2,
    x.Dato3
};

Entonces puedes hacer lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
var listafinal = new List<Centro>();
foreach (var item in r)
{
    var c = new Centro
    {
        ID = item.ID,
        Nombre = item.Nombre,
        Dato1 = item.Dato1,
        Dato2 = item.Dato2,
        Dato3 = item.Dato3
    };
    listafinal.Add(c);
}

Y ya está solucionado prácticamente tu problema sin recurrir a reflection

1
2
3
4
5
6
7
8
9
10
11
comboBox1.DataSource =listafinal;
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Nombre";
 
 
private void ComboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
    var dato = comboBox1.SelectedItem as Centro;
 
    MessageBox.Show(dato.Dato2);
}


Espero lo tomes en consideración y evalúes el rendimiento sobre reflection.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar