none
Ayuda con programación de ComboBox en C# RRS feed

  • Pregunta

  • Hola, muy buenas.

    Contextualizando un poco, esto desarrollando una aplicación en WF con el lenguaje c#.

    Ahora bien, estoy desde hace un par de días en una situación que no me deja avanzar. Resulta que dentro del Form tengo un comboBox del cual obtengo el índice, pero necesito de la misma forma obtener el parámetro del mismo índice que selecciono, cabe añadir que obtengo esta información de una tabla ya hecha en una Base de datos, para volver a insertar esta información en otra tabla de la misma base de datos.

    Ya obtengo el índice, como decía anteriormente, pero la rutina para poder obtener el nombre relacionado al índice se me resiste, no puedo hacerlo.

    Esta parte se me indico que debe de ir dentro del evento selectedIndexChanged, pero aún así no se carga, ni en el evento, ni en el evento de click del botón.

    Dejo acá parte del código que leería el array y seleccionaria conforme al índice, su nombre.

         int indice = cmbProducto.SelectedIndex; 
         IngresoInventario.nombre = cmbProducto.Items[indice].ToString(); 

    miércoles, 9 de diciembre de 2020 23:45

Respuestas

  • Hola

    Yo te decía que pruebes con 

    cmbProducto.SelectedItem

    que no es un evento, es una propiedad, como SelectedValue, que da el item que corresponde al ID

    • Propuesto como respuesta EricRRModerator viernes, 11 de diciembre de 2020 19:55
    • Marcado como respuesta EricRRModerator lunes, 14 de diciembre de 2020 15:31
    viernes, 11 de diciembre de 2020 14:28

Todas las respuestas

  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    jueves, 10 de diciembre de 2020 14:30
    Moderador
  • Hola MigrationUser

    Entiendo que no debería fallar el código que pasaste. O si no, podrías probar con SelectedItem.

    Si no, mostra más del código para que podamos ver donde está el problema.

    Saludos

    Pablo

    jueves, 10 de diciembre de 2020 17:31
  • Hola Tigre Pablito, gracias por interesarte en la duda planteada.

    Por tu respuesta, entiendo que has captado la idea que estoy tratando transmitir.

    El problema está en transladar información de una tabla a otra tabla en una base de datos relacional. Mediante el combobox, que de por si obtengo el id con SelectedValue, estoy tratando de obtener el nombre del producto, que va relacionado en la tabla de dato producto.

    Ya he intentado con el evento que indicas, pero aún no puedo obtener el resultado deseado.

    Voy a insertar más del código para que te puedas contextualizar.

    La rutina en cmbProducto.SelectedValue me inserta el idProducto justo como lo necesito,no así la siguiente línea, cuando busco el nombre que tiene ese id.

    //Esta parte representa la asignación de los elementos que tienen la información solicitada, desde el combobox y cajas de texto, a las variables que almacenaran en BD la información ingresada.
    Es de mencionar que IngresoInventario es la clase constructor de las variables.
    
    IngresoInventario.idProducto = Convert.ToInt32(cmbProducto.SelectedValue);
    IngresoInventario.nombre = cmbProducto.Items[indice].ToString();
    IngresoInventario.cantidad = Convert.ToInt32(txtCantidad.Text);
    
    
    //Esta es la inserción para la base de datos
    
    SqlCommand Comand = new SqlCommand(
                                string.Format("INSERT INTO Inventario(idProducto, nombre, cantidad) VALUES({0}, '{1}', {2})",
                                IngresoInventario.idProducto, IngresoInventario.nombre, IngresoInventario.cantidad), Conexion);


    JR

    viernes, 11 de diciembre de 2020 3:57
  • Algo así tiene que ser:

          int indice = cmbProducto.SelectedIndex; 
          
          String nombre = ((DataRowView)cmbProducto.Items[indice])[1].ToString(); //[1]: índice de la posición de la columna "nombre"
          String nombre1 = cmbProducto.Text;
    

    viernes, 11 de diciembre de 2020 11:56
  • Si el resultado de la consulta lo almacenas en un objeto DataTable, puedes realizar lo siguiente:

     

    tuComboBox.DataSource=tuDataTable;
    tuCombobox.DisplayMember =TuDataTable.Columns(IndiceColumnaVisualizar).ColumnName
    tuCombobox.ValueMember =TuDataTable.Columns(IndiceColumnaIndice).ColumnName


    Espero que te sirva.

    viernes, 11 de diciembre de 2020 12:28
  • Hola

    Yo te decía que pruebes con 

    cmbProducto.SelectedItem

    que no es un evento, es una propiedad, como SelectedValue, que da el item que corresponde al ID

    • Propuesto como respuesta EricRRModerator viernes, 11 de diciembre de 2020 19:55
    • Marcado como respuesta EricRRModerator lunes, 14 de diciembre de 2020 15:31
    viernes, 11 de diciembre de 2020 14:28
  • Gracias por interesarte, te comento que no estoy utilizando un DataTable.

    Lo que hago es crear un producto y guardarlo en una tabla del mismo nombre.

    Luego, cargo en un comboBox los datos que tengo en la tabla con el siguiente còdigo.

    cmbProducto.DataSource = CreateProducts.ObtenerProductos(); cmbProducto.DisplayMember = "Nombre"; cmbProducto.ValueMember = "Id";

    Despuès de esto, al tener ya creado el producto necesito insertarlo en una tabla inventario, que, como sabràs esta relacionada en la base de datos, por lo tanto ya obtengo el id del producto desde el comboBox utilizando:

    IngresoInventario.idProducto = Convert.ToInt32(cmbProducto.SelectedValue);

    Ahora bien, lo que necesito es obtener el dato que tengo en la columna nombre con relaciòn al id que ya he obtenido, para lo cual aùn mantengo abierto el debate, ya que no tengo respuesta todavìa.


    JR

    miércoles, 16 de diciembre de 2020 17:36
  • Gracias por responder Tigre.

    Fijate que ya habìa intentado hacer eso, y como te voy a explicar, la propiedad SelectedValue no me recoge el nombre del id, sino lo que hace es copiarme la ruta donde proceso el registro, o sea:

    InventarioSP.MostrarProduct

    En base de datos, ya en la tabla donde quiero insertar el nombre seleccionado en Producto me almacena el registro que te indico arriba, por lo tanto no me sirve.


    JR

    miércoles, 16 de diciembre de 2020 17:46
  • AntiWork me alegra ver tu predisposiciòn por ayudar, pero lamentablemente no me sirvió de mucho tu ejemplo.

    Lo de DataRowView no lo entendí muy bien, pero aún lo intenté pero VS me maltrató diciendo que no podía agregar ciertos parámetros de esta función al no entenderle demasiado que hacía allí.

    De todas formas gracias por comentar, si quieres un poco más de contexto, abajo le respondí a Martí como es que estoy realizado esto.


    JR

    miércoles, 16 de diciembre de 2020 17:50
  • Hola Jordi

    Vos sos MigrationUser? Son la misma persona? Porque se ve que quien firma la pregunta es MigrationUser.

    No entiendo nada. Recuerdo que el usuario MigrationUser había borrado todas sus respuestas y preguntas hace no mucho. Bueno, que se yo, son cosas que pasan en el foro, esto del cambio de nombres y las borradas de mensajes.

    Respecto a tu problema, el código que pasaste al principio no debería fallar, ni tampoco si usas lo que yo te dije, SelectedItem. Explica bien con más detalle por favor cual es tu inconveniente, y pasa el código involucrado que no funciona, a ver si te puedo ayudar.

     

    miércoles, 16 de diciembre de 2020 21:19
  • Gracias por tu ayuda, pues por lo que veo soy la misma persona, no tengo idea de lo que haya hecho la plataforma pero soy Jordi.

    De vuelta al tema, te debo agradecer la voluntad por seguir con el tema.

    Voy a contextualizarte un poco más con el tema, porque aún no me deja insertar la data como quiero.

    Voy a colocar la función click de inserción de datos en la tabla Inventario, que como bien he dicho antes, obtiene los parámetros de la tabla Producto, del cual obtengo la información mediante la utilización del comboBox.

    Te coloco la forma en el que el combobox obtiene la información:

    private void FrmCargaInventario_Load(object sender, EventArgs e)
            {
                cmbProducto.DataSource = CreateProducts.ObtenerProductos();
    
                cmbProducto.DisplayMember = "Nombre";
                cmbProducto.ValueMember = "Id";
    
            }

    Y, ObtenerProductos es esto:

    public static List<MostrarProducto> ObtenerProductos()
            {
                List<MostrarProducto> _Lista = new List<MostrarProducto>();
    
                SqlConnection conexion = ConexionBD.ObtenerConexion();
    
                SqlCommand _Comando = new SqlCommand("select codigoProducto, nombre from Producto", conexion);
                SqlDataReader _reader = _Comando.ExecuteReader();
    
                while (_reader.Read())
                {
                    MostrarProducto pCategoria = new MostrarProducto();
    
                    pCategoria.Id = _reader.GetInt32(0);
                    pCategoria.Nombre = _reader.GetString(1);
    
                    _Lista.Add(pCategoria);
                }
                _reader.Close();
                return _Lista;
            }

    Ahora bien el Evento del Botón para insertar es el siguiente:

    private void btnCargo_Click(object sender, EventArgs e) { int i; int indice = cmbProducto.SelectedIndex; Invent IngresoInventario = new Invent(); SqlConnection Conexion = ConexionBD.ObtenerConexion(); IngresoInventario.idProducto = Convert.ToInt32(cmbProducto.SelectedValue); IngresoInventario.nombre = cmbProducto.SelectedItem.ToString(); //Lo tengo como me comento Tigre, ya te voy a mostrar la salida que da IngresoInventario.cantidad = Convert.ToInt32(txtCantidad.Text); //Actualizar info si

    //No actualizo nombre ya que nada tiene que ver al interesarme solo actulizar el campo cantidad SqlCommand Comando = new SqlCommand(string.Format("UPDATE Inventario SET cantidad = cantidad + " + Convert.ToInt32(txtCantidad.Text) + " WHERE idProducto = " + (cmbProducto.SelectedValue) + " "), Conexion); i = Comando.ExecuteNonQuery(); try { if (i == 1) { MessageBox.Show("Se cargó la cantidad satifactoriamente"); txtCantidad.Text = ""; } else if (i != 1) { int a; //Inserta si no se ha cargado con anterioridad

    //Y es aca donde llamo a la variable que almacenará la data que ingresa el user SqlCommand Comand = new SqlCommand( string.Format("INSERT INTO Inventario(idProducto, nombre, cantidad) VALUES({0}, '{1}', {2})", IngresoInventario.idProducto, IngresoInventario.nombre, IngresoInventario.cantidad), Conexion); a = Comand.ExecuteNonQuery(); if (a == 1) { MessageBox.Show("Se cargó la cantidad satisfactoriamente"); txtCantidad.Text = ""; } else { MessageBox.Show("No se pudo cargar"); } } } catch (Exception ex) { MessageBox.Show("Hubo un error al cargar los datos.."); } }


    Y este sería todo el contexto del problema que aún no logro solucionar, como último punto te dejo la salida que da esa propiedad

    Así que, espero tu respuesta como no si fuese mi regalo de navidad.

    Ya probé varios otras propiedades, pero me da distinto resultados, como el de la fila 8, como te das cuenta, me inserta Nombre, como la forma en que lo declare en el form para la exposición de la data.


    JR

    miércoles, 16 de diciembre de 2020 22:35
  • Hola Jordi

    Te confundiste con los nombres de las columnas de la tabla, mira:

    
    "select codigoProducto, nombre from Producto"


    Y mira:

    cmbProducto.DisplayMember = "Nombre";
    cmbProducto.ValueMember = "Id";

    El campo Id no lo cargas en tu objeto lista, quizás debería ser codigoProducto en su lugar. Por eso no te funcionaba el ComboBox como correspondía.

    Por otro lado, me pregunto por qué el Moderator marca como respondida una pregunta que todavía en ese momento no lo estaba, o sea, por qué no permiten que sean quienes preguntan los que marquen o no la respuesta. 

    Saludos

    Pablo


    jueves, 17 de diciembre de 2020 1:03
  • OTRA VEZ NO SE VE MI RESPUESTA

    ASI QUE VAMOS DE NUEVO

    Hola Jordi

    Te confundiste los nombres de las columnas de la tabla, mira:

    "select codigoProducto, nombre from Producto"

    Y mira:

    cmbProducto.DisplayMember = "Nombre";
    cmbProducto.ValueMember = "Id";

    El campo Id no lo cargaste en tu objeto lista, quizas es codigoProducto en su lugar. Por eso no te funcionaba el ComboBox.

    Saludos

    Pablo

    jueves, 17 de diciembre de 2020 20:32
  • Y AHORA SE VEN LAS 2 ULTIMAS RESPUESTAS. 
    jueves, 17 de diciembre de 2020 20:37
  • IngresoInventario.nombre = ((MostrarProducto)cmbProducto.SelectedItem).Nombre

    Explicación: SelectedItem devolverá el objeto seleccionado. Los objetos con los que cargas el combo son de la clase "MostrarProducto". Esta clase, aunque no mostras su codigo, se ve que tiene al menos 2 propiedades: "Id" y "Nombre".

    Los objetos devueltos por SelectedItem son del tipo Object, para convertirlos en objetos del tipo MostrarProducto se realiza el "casteo", en este caso: (MostrarProducto)cmbProducto.SelectedItem, Esto te devuelve un objeto del tipo MostrarProducto. Luego podrás obtener el valor de cualquiera de sus propiedades.

    Era clave saber como se cargaba el combo. El código de la función "ObtenerProductos" lo aclara.

    viernes, 18 de diciembre de 2020 3:22
  • Hola AntiWork, ahí veo que me equivoqué, lo aclaro para que no se confunda Jordi, pero, aunque no me es familiar la sintaxis de tu respuesta, te soy franco, desconozco, o sea no se si está bien o no, pero si están bien las propiedades Id y Nombre en el ValueMember y DisplayMember, que lo están por lo que vi ahora que no vi antes, la propiedad SelectedItem pura no debería fallar. Es muy raro esto. SelectedItem devuelve la propiedad que se asigna a DisplayMember (que es siempre un string) y SelectedValue devuelve la clave o código correspondiente a ese string en la tabla de la base de datos (un int o ID generalmente). 

    .........

    .........

    pero espera ... a ver si encontré el percance de una vez ... vos Jordi, declaraste Id y Nombre como propiedades en la clase MostrarProducto?

    Es decir, algo como esto:

    public int Id { get; set; }

    public string Nombre { get; set; }

    porque si no los declaraste como propiedades no funcionaría correctamente ... a ver si cumplí con el regalo de Navidad? ... ja ja ja!


    viernes, 18 de diciembre de 2020 18:35