none
Agregar imagen a Datagrisview RRS feed

  • Pregunta

  • amigos tengo un data grid entonces necesito agregar dos columnas uno sera la Referencia de un articulo y otro será la imagen

    entonces tengo una pantalla que lo que hace es agregar imagenes y descripcion

    Entonces lo necesito algo asi pero tendria que leer toda mi tabla de productos y segun va leyendo tiene que buscar la imagen en la carpeta c:imagenes

    como puedo hacerlo

    saludos


    ruben

    viernes, 24 de noviembre de 2017 18:07

Respuestas

  • Vale, 

    creo que lo tengo, se me habia pasado abrir la conexion, que es algo que el datatable no necesita, pero el reader si.

    Prueba asi:

    private List<string> leerBD()
    {
      List<string> ret = new List<string>();
      using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
      {
        //Abre la conexion
        cnoficina.Open();
        //Consulta
        string queryoficina = @"select noproducto from productos limit 10";
        //definimos el comando
        using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
        { //definimos el reader
          using (MySqlDataReader reader = cmd.ExecuteReader())
          { //leemos todo el contenido
            while (reader.Read())
            { //añadimos a la lista todos los items
              ret.Add(reader.GetString(0));
            }
          }
        }
      }
      return ret;
    }

    Este es mi resultado

    En el caso de que no te funciona, depura el método que te acabo de poner, el que lee de la DB, para verificar que esta leyendo datos, y si no lee, comprueba que la DB tenga datos para leer.

    Nos comentas el resultado

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 27 de noviembre de 2017 15:40
  • Vale,

    tengo algo... no se si te valdra...

    Lo primero, define las columnas del datagridview en el diseñador, yo para probar he definido 2 columnas, una de tipo DataGridViewTextBoxColumn y otra para la imagen de tipo DataGridViewImageColumn

    Una vez teniendo eso, prueba este código:

    private void CargarDGV()
    {
      //No queremos que se generen nuevas columnas
      dataGridView1.AutoGenerateColumns = false;
    
      //Este es el path de las imagenes, el {0} es importante ya que luego se rremplaza con string.Format dejando en su lugar el nombre
      string strFolder = "E:\\Imagenes\\{0}.jpg";
    
      //Lee una lista desde la DB y la asigna al datagridview
      dataGridView1.DataSource = leerBD();
    
      //Recorremos el datagridview
      foreach (DataGridViewRow row in dataGridView1.Rows)
      {
        //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<string>)
        string name = row.DataBoundItem as string;
    
    
        if (name != null)
        {
          //Añadimos el nombre a la columna 0
          row.Cells[0].Value = name;
          //Añadimos la imagen a la columna 1
          if (File.Exists(string.Format(strFolder, name)))
            row.Cells[1].Value = new Bitmap(string.Format(strFolder, name));
          else
            row.Cells[1].Value = new Bitmap(string.Format(strFolder, "Default"));
        }
    
      }
    
    }
    
    
    private List<string> leerBD()
    {
      List<string> ret = new List<string>();
      using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
      {
        string queryoficina = @"select noproducto from productos limit 10";
        //definimos el comando
        using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
        { //definimos el reader
          using (MySqlDataReader reader = cmd.ExecuteReader())
          { //leemos todo el contenido
            while (reader.Read())
            { //añadimos a la lista todos los items
              ret.Add(reader.GetString(0));
            }
          }
        }
      }
      return ret;
    }

    Seguramente no sea lo mejor, pero bueno, al menos funciona... nos vas comentano

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:



    lunes, 27 de noviembre de 2017 15:15
  • Buenas Ruben,

    Si que ha cambiado un poquito, el tema es que

     row.DataBoundItem

    devuelve el item que se le cargo, entonces, como ahora quieres cargarle 2 datos, en vez de un List<string>, he añadido una clase Datos, para hacer un List<Datos>, de modo que tengas las 2 strings (o si el dia de mañana quieres añadir nuevas columnas, las puedas añadir comodamente).

    Te dejo el codigo:

    class Datos
    {
      public string strReferencia { get; set; }
      public string strDescipcion { get; set; }
    }
    
    private void CargarDGV()
    {
      //No queremos que se generen nuevas columnas
      dataGridView1.AutoGenerateColumns = false;
    
      //Este es el path de las imagenes, el {0} es importante ya que luego se rremplaza con string.Format dejando en su lugar el nombre
      string strFolder = "E:\\Imagenes\\{0}.jpg";
    
      //Lee una lista desde la DB y la asigna al datagridview
      dataGridView1.DataSource = leerBD();
    
    
      //Recorremos el datagridview
      foreach (DataGridViewRow row in dataGridView1.Rows)
      {
        //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<Datos>)
        Datos currentDatos = row.DataBoundItem as Datos;
    
        if (currentDatos != null)
        {
          //Añadimos el nombre a la columna 0
          row.Cells[0].Value = currentDatos.strReferencia;
          row.Cells[1].Value = currentDatos.strDescipcion;
          //Añadimos la imagen a la columna 1
          if (File.Exists(string.Format(strFolder, currentDatos.strReferencia)))
            row.Cells[2].Value = new Bitmap(string.Format(strFolder, currentDatos.strReferencia));
          else
            row.Cells[2].Value = new Bitmap(string.Format(strFolder, "Default"));
        }
      }
    
    }
    
    private List<Datos> leerBD()
    {
      List<Datos> ret = new List<Datos>();
    
      using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
      {
        //Abre la conexion
        cnoficina.Open();
        //Consulta
        string queryoficina = @"select noproducto, descprod from productos limit 10";
        //definimos el comando
        using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
        { //definimos el reader
          using (MySqlDataReader reader = cmd.ExecuteReader())
          { //leemos todo el contenido
            while (reader.Read())
            { //añadimos a la lista todos los items
              ret.Add(new Datos() { strReferencia = reader.GetString(0), strDescipcion = reader.GetString(1) });
            }
          }
        }
      }
      return ret;
    }

    Para usarlo, debes tener en el datagridview 3 columnas, la 0 y la 1 de tipo texto, y la dos de tipo imagen

    Y el resultado es este

    Si quieres añadir campos, simplemente, añades la columna al datagridview, añades la propiedad a la clase Datos, y añades la lectura en el select, con eso, cuando llames al objeto Datos del BoundingItem, tendras ese nuevo dato para ponerlo tambien

    Si tienes dudas comentanos

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 16:57
    martes, 28 de noviembre de 2017 16:14
  • Buenas Ruben,

    Existe la imagen 

     "E:\\Imagenes\\Default.jpg";

    ¿?

    Eso esta puesto porque me comentaste que si no existia, querias cargar una imagen Default, asi que suspuse que se llamaria Default.jpg...

    Coje la imagen que quieres mostrar si la que le corresponde no existe, llamada "Default.jpg" y metela en "E\Imagenes\",

    Nos comentas el resultado

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 16:57
    martes, 28 de noviembre de 2017 16:41
  • *****...

    Y si en el breakpoint en el que te dice que tienes 10 valores, ves los valores? que te dice?

    Es raro que de repente se pierda...

    Si miras  el DataSource, después de que nFilas diga que es 0, sigue teniendo 10? Digo esto por si hay algún evento que este borrando el datasource...

    Espero tu respuesta

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 12:54
    martes, 28 de noviembre de 2017 9:38

Todas las respuestas

  • Aqui estoy cargando mi bd

     private void leerBD()
            {
                DataTable dt = new DataTable();
                using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
                {
                    string queryoficina = @"select noproducto, descprod from productos";
    
                    MySqlDataAdapter daoficina = new MySqlDataAdapter(queryoficina, cnoficina);
                    daoficina.Fill(dt);
                    cnoficina.Close();
    
                }
    
                dataGridView1.DataSource = dt;
    
            }

    Ahora necesito que registro a registro recorra la BD y agregue la imagen alado


    ruben

    viernes, 24 de noviembre de 2017 18:11
  • Amigos he echo esto 

    He creado un datatable

     private DataTable GetDataTable()
            {
    
                DataTable dt = new DataTable();
    
                dt.Columns.Add("referencia");
                dt.Columns.Add("imagen");
               
                return dt;
            }

    y luego voy leyendo uno a uno para rellenar 

     private void leerBD()
            {
                DataTable dt = new DataTable();
                using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
                {
                    string queryoficina = @"select noproductofrom productos";
    
                    MySqlDataAdapter da = new MySqlDataAdapter(queryoficina, cnoficina);
                    da.Fill(dt);
                    cnoficina.Close();
    
    
                    DataTable get = GetDataTable();
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
    
    
                        DataRow dr = dt.Rows[i];
                        DataRow newRow = dt.NewRow();
    
                        newRow["referencia"] = dr["noproducto"];//Cargamos el codigo de Familia
                       
                        dt.Rows.Add(newRow);
                    }
    
                    dataGridView1.DataSource = dt;
    
                }
    
              
    
            }

    Y lo que me faltaria sera buscar la imagen en la carpeta segun voy leyendo


    ruben

    viernes, 24 de noviembre de 2017 18:22
  • Buenas Rubén,

    En la db tienes la ruta a la imagen? O guardas algún identificador? Como sabes que imagen va con que referencia?

    Dinos eso, y una vez sabiendo como las relacionas, la búsqueda es fácil. 

    Quedó a la espera de tu respuesta. 

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    viernes, 24 de noviembre de 2017 18:32
  • Hola jorge

    La imagen tiene un nombre 43002345  y cuando consulta el listado trae ese dato de la BD que es la referencia 43002345

    es decir si me referencia se llama cuaderno , la imagen se llama cuaderno y la referencia de la BD es un numero 4300 la imagen se llama 4300

    Salaudos


    ruben

    lunes, 27 de noviembre de 2017 11:56
  • Jorge lo he intentado asi y nad ame da error

     private void leerBD()
            {
                DataTable dt = new DataTable();
                using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
                {
                    string queryoficina = @"select noproducto from productos limit 10";

                    MySqlDataAdapter da = new MySqlDataAdapter(queryoficina, cnoficina);
                    da.Fill(dt);
                    cnoficina.Close();


                    DataTable get = GetDataTable();
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {


                        DataRow dr = dt.Rows[i];
                        DataRow newRow = dt.NewRow();

                        newRow["noproducto"] = dr["noproducto"];//Cargamos el codigo de Familia
                        string referencia = Convert.ToString(dr["noproducto"]);

                        
                        string path = "E:\\Imagenes\\" + referencia + ".jpg";

                        newRow["noproducto"] = System.Drawing.Image.FromFile(path);
                      





                        dt.Rows.Add(newRow);
                    }

                    dataGridView1.DataSource = dt;

                }

              

            }


    ruben

    lunes, 27 de noviembre de 2017 12:41
  • La verdad, es que con un datatable no se me ocurre ninguna opción fácil  y eficiente para hacerlo... lo siento

    Lo que si se me ocurre, es que en vez de usar un DataAdapter, uses un datareader, y construyas datagridview en la lectura, de manera que tal cual lo leas, vayas haciendo la conversión de una en una... siento no ser de más ayuda, a ver si alguien más puede ayduarte

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 27 de noviembre de 2017 13:52
  • Como puedo hacer eso que dices Jorge? No me importa hacer de otra forma

    Saludos


    ruben


    lunes, 27 de noviembre de 2017 14:38
  • Jorge codigo desde  0 no pensamos en datatable, sino una consulta sql que me muestr la referencia y luego busca la imagen

    Yo agrego un datagridview

    El gridview me muestra este campos:
    referencia

    y me gustaría agregar un campo imagen, que me cargue la imagen dinamicamente. Es decir, yo tengo en una carpeta "Fotos Productos" dentro de la carpeta de mi proyecto, y tienen como nombre el id del producto mas su extención jpg, o sea:
    1.jpg  -> es la imagen del IdProducto = 1
    2.jpg  -> es la imagen del IdProducto = 2
    3.jpg  -> es la imagen del IdProducto = 3

    Entonces, ¿se podría cargar las imagenes dinamicamente tomando el valor del campo referencia? y que en caso de no encontrarla se cargue una Default.jpg (que seria una imagen de "Foto no disponible") 


    ruben

    lunes, 27 de noviembre de 2017 14:47
  • Vale,

    tengo algo... no se si te valdra...

    Lo primero, define las columnas del datagridview en el diseñador, yo para probar he definido 2 columnas, una de tipo DataGridViewTextBoxColumn y otra para la imagen de tipo DataGridViewImageColumn

    Una vez teniendo eso, prueba este código:

    private void CargarDGV()
    {
      //No queremos que se generen nuevas columnas
      dataGridView1.AutoGenerateColumns = false;
    
      //Este es el path de las imagenes, el {0} es importante ya que luego se rremplaza con string.Format dejando en su lugar el nombre
      string strFolder = "E:\\Imagenes\\{0}.jpg";
    
      //Lee una lista desde la DB y la asigna al datagridview
      dataGridView1.DataSource = leerBD();
    
      //Recorremos el datagridview
      foreach (DataGridViewRow row in dataGridView1.Rows)
      {
        //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<string>)
        string name = row.DataBoundItem as string;
    
    
        if (name != null)
        {
          //Añadimos el nombre a la columna 0
          row.Cells[0].Value = name;
          //Añadimos la imagen a la columna 1
          if (File.Exists(string.Format(strFolder, name)))
            row.Cells[1].Value = new Bitmap(string.Format(strFolder, name));
          else
            row.Cells[1].Value = new Bitmap(string.Format(strFolder, "Default"));
        }
    
      }
    
    }
    
    
    private List<string> leerBD()
    {
      List<string> ret = new List<string>();
      using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
      {
        string queryoficina = @"select noproducto from productos limit 10";
        //definimos el comando
        using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
        { //definimos el reader
          using (MySqlDataReader reader = cmd.ExecuteReader())
          { //leemos todo el contenido
            while (reader.Read())
            { //añadimos a la lista todos los items
              ret.Add(reader.GetString(0));
            }
          }
        }
      }
      return ret;
    }

    Seguramente no sea lo mejor, pero bueno, al menos funciona... nos vas comentano

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:



    lunes, 27 de noviembre de 2017 15:15
  • Muchas gracias Jorge lo he probado

    mira esta parte no lo hace es decir no entra

       //Recorremos el datagridview
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<string>)
                    string name = row.DataBoundItem as string;
    
    
                    if (name != null)
                    {
                        //Añadimos el nombre a la columna 0
                        row.Cells[0].Value = name;
                        //Añadimos la imagen a la columna 1
                        if (File.Exists(string.Format(strFolder, name)))
                            row.Cells[1].Value = new Bitmap(string.Format(strFolder, name));
                        else
                            row.Cells[1].Value = new Bitmap(string.Format(strFolder, "Default"));
                    }
    
                }

    es cmoo que leer Bd esta vacio 


    ruben

    lunes, 27 de noviembre de 2017 15:28
  • Buenas,

    dame un momento, voy a probarlo contra MySQL, me costara unos minutos porque tengo que crear la DB

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 27 de noviembre de 2017 15:32

  • ruben

    lunes, 27 de noviembre de 2017 15:32
  • Vale, 

    creo que lo tengo, se me habia pasado abrir la conexion, que es algo que el datatable no necesita, pero el reader si.

    Prueba asi:

    private List<string> leerBD()
    {
      List<string> ret = new List<string>();
      using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
      {
        //Abre la conexion
        cnoficina.Open();
        //Consulta
        string queryoficina = @"select noproducto from productos limit 10";
        //definimos el comando
        using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
        { //definimos el reader
          using (MySqlDataReader reader = cmd.ExecuteReader())
          { //leemos todo el contenido
            while (reader.Read())
            { //añadimos a la lista todos los items
              ret.Add(reader.GetString(0));
            }
          }
        }
      }
      return ret;
    }

    Este es mi resultado

    En el caso de que no te funciona, depura el método que te acabo de poner, el que lee de la DB, para verificar que esta leyendo datos, y si no lee, comprueba que la DB tenga datos para leer.

    Nos comentas el resultado

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 27 de noviembre de 2017 15:40
  • Hola jorge no funciona

    Si trae resultado no se si has visto la imagen que te envie

    pero tiene problema en el metodo CargarDGV()

      foreach (DataGridViewRow row in dataGridView1.Rows)
                { en esta linea trae vacio  el datasourse no carga pero si tiene datos


    ruben

    lunes, 27 de noviembre de 2017 18:06
  • En mi diseñador debo de dejar vacio o crear las dos columnas


    ruben

    lunes, 27 de noviembre de 2017 18:10
  • aunque eso no tiene nada que ver por que el datasource esta vacio

    ruben

    lunes, 27 de noviembre de 2017 18:10
  • Buenas ruben,

    Las columnas en diseño estan vacias, ningun problema, porque las va a llenar el foreach, es lo normal, lo que me preocupa es que no entre en el, si tiene 10 objetos, no tiene sentido... si antes del foreach escribes

    int nFilas = dataGridView1.Rows.Count();

    y pones una interrupcion, que valor tiene nFilas? (no recuerdo si es Count() o Count)

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 27 de noviembre de 2017 20:18
  • Buenos Días Jorge Mira, esto es increible

    este es el valor antes de int filas

    Y este es el valor a continuacion

    Es increible por eso te lo dejo en pantallazos

    Saludos


    ruben

    martes, 28 de noviembre de 2017 8:33
  • *****...

    Y si en el breakpoint en el que te dice que tienes 10 valores, ves los valores? que te dice?

    Es raro que de repente se pierda...

    Si miras  el DataSource, después de que nFilas diga que es 0, sigue teniendo 10? Digo esto por si hay algún evento que este borrando el datasource...

    Espero tu respuesta

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 12:54
    martes, 28 de noviembre de 2017 9:38
  • Jorge he comentado esta linea y ya entra en el foreach

    //  dataGridView1.AutoGenerateColumns = false;

    pero ahora meda un error


    ruben

    martes, 28 de noviembre de 2017 9:49
  • Espera...

    No, la linea que has comentado no la tienes que comentar, la idea de esa linea es que no se generen nuevas columnas, porque tu ya has generado 2 en el diseñador. Confirmame que tienes dos columnas vacias en el diseñador, la primera de tipo text y la segunda de tipo imagen.

    Asi lo tengo yo en las pruebas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    martes, 28 de noviembre de 2017 9:56
  • Vale he vuelto a descomentar he creado las dos columnas una de text y otra de imagen (es que le habia quitado)

    biein ahora funcioan hace todo pero no rellena 

    saludos


    ruben

    martes, 28 de noviembre de 2017 10:01
  • el valor si rellena

    Pero no muestra en el datagrid


    ruben

    martes, 28 de noviembre de 2017 10:04
  • Me ha creado las 10 filas pero vacías :(

    ruben

    martes, 28 de noviembre de 2017 10:05
  • Jorge que me podría faltaría, pongo el codigo como quedo

       private void CargarDGV()
            {
                //No queremos que se generen nuevas columnas
                dataGridView1.AutoGenerateColumns = false;
    
                //Este es el path de las imagenes, el {0} es importante ya que luego se rremplaza con string.Format dejando en su lugar el nombre
                string strFolder = "E:\\Imagenes\\{0}.jpg";
    
                //Lee una lista desde la DB y la asigna al datagridview
                 dataGridView1.DataSource = leerBD();
               // leerBD2();
                int nFilas = dataGridView1.Rows.Count;
                //Recorremos el datagridview
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<string>)
                    string name = row.DataBoundItem as string;
    
    
                    if (name != null)
                    {
                        //Añadimos el nombre a la columna 0
                        row.Cells[0].Value = name;
                        //Añadimos la imagen a la columna 1
                        if (File.Exists(string.Format(strFolder, name)))
                            row.Cells[1].Value = new Bitmap(string.Format(strFolder, name));
                        else
                            row.Cells[1].Value = new Bitmap(string.Format(strFolder, "Default"));
                    }
    
                }
    
            }

      private List<string> leerBD()
            {
                List<string> ret = new List<string>();
    
                using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
                {
                    //Abre la conexion
                    cnoficina.Open();
                    //Consulta
                    string queryoficina = @"select noproducto from productos limit 10";
                    //definimos el comando
                    using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
                    { //definimos el reader
                        using (MySqlDataReader reader = cmd.ExecuteReader())
                        { //leemos todo el contenido
                            while (reader.Read())
                            { //añadimos a la lista todos los items
                                ret.Add(reader.GetString(0));
                            }
                        }
                    }
                }
                return ret;

    Y un datagrid de dos columnas una tex y otro imagen

    y no carga la imagen  ni el texto

    Saludos


    ruben

    martes, 28 de noviembre de 2017 10:26
  • Jorge amigo que puede ser ya he probado otras cosa y nada :(

    ruben

    martes, 28 de noviembre de 2017 11:41
  • Gracias Jorge ya funciona mil millones de gracias


    ruben

    martes, 28 de noviembre de 2017 12:54
  • Hola Jorge

    Como puedo añadir una columna mas la de descripcion 

    ya he agregado en la columna 

    primero la referencia luego la descripcion y por ultimo la foto

    en el selec tambien esta pero me falta aqui

     private void CargarDGV()
            {
                //No queremos que se generen nuevas columnas
                dataGridView1.AutoGenerateColumns = false;
    
                //Este es el path de las imagenes, el {0} es importante ya que luego se rremplaza con string.Format dejando en su lugar el nombre
                string strFolder = "E:\\Imagenes\\{0}.jpg"; 
    
                //Lee una lista desde la DB y la asigna al datagridview
                dataGridView1.DataSource = leerBD();
    
    
              
    
    
                //Recorremos el datagridview
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<string>)
                    string name = row.DataBoundItem as string;
                    string descripcion = row.DataBoundItem as string;
    
                    if (name != null)
                    {
                        //Añadimos el nombre a la columna 0
                        row.Cells[0].Value = name;
                        row.Cells[1].Value = descripcion;
                        string nombre = name;
                        //Añadimos la imagen a la columna 1
                        if (File.Exists(string.Format(strFolder, name)))
                            row.Cells[2].Value = new Bitmap(string.Format(strFolder, name));
                        else
                           row.Cells[2].Value = new Bitmap(string.Format(strFolder, "Default"));
    
    
                    }

    saludos


    ruben

    martes, 28 de noviembre de 2017 14:16
  • Buenas Ruben, 
    Pon tambien el metodo del select, ya que ahora mismo estas pasando un List<string>, u lo que hace falta dos strings, asi que lo suyo seria definir una clase o un struct  para contenerlas... 

    Pasame el codigo que tienes exactamente para la otra funcion y lo vemos (o dime si no lo has cambiado al final)

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    martes, 28 de noviembre de 2017 14:25
  • Jorge mira este es el codigo 

    asi lo puse :)

    pero nada

      private void CargarDGV()
            {
                //No queremos que se generen nuevas columnas
                dataGridView1.AutoGenerateColumns = false;
    
                //Este es el path de las imagenes, el {0} es importante ya que luego se rremplaza con string.Format dejando en su lugar el nombre
                string strFolder = "E:\\Imagenes\\{0}.jpg"; 
    
                //Lee una lista desde la DB y la asigna al datagridview
                dataGridView1.DataSource = leerBD();
    
    
              
    
    
                //Recorremos el datagridview
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<string>)
                    string name = row.DataBoundItem as string;
                    string descripcion = row.DataBoundItem as string;
    
                    if (name != null)
                    {
                        //Añadimos el nombre a la columna 0
                        row.Cells[0].Value = name;
                        row.Cells[1].Value = descripcion;
                        string nombre = name;
                        //Añadimos la imagen a la columna 1
                        if (File.Exists(string.Format(strFolder, name)))
                            row.Cells[2].Value = new Bitmap(string.Format(strFolder, name));
                        else
                           row.Cells[2].Value = new Bitmap(string.Format(strFolder, "Default"));
    
    
                    }
    
    
                }
    
            }
    
    
            private List<string> leerBD()
            {
                List<string> ret = new List<string>();
    
                using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
                {
                    //Abre la conexion
                    cnoficina.Open();
                    //Consulta
                    string queryoficina = @"select noproducto, descprod from productos limit 10";
                    //definimos el comando
                    using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
                    { //definimos el reader
                        using (MySqlDataReader reader = cmd.ExecuteReader())
                        { //leemos todo el contenido
                            while (reader.Read())
                            { //añadimos a la lista todos los items
                                ret.Add(reader.GetString(0));
                                ret.Add(reader.GetString(1));
                            }
                        }
                    }
                }
                return ret;
    
            }

    saludos


    ruben

    martes, 28 de noviembre de 2017 15:28
  • quiere decir que la parte del select va a cambiar?

    saludos


    ruben

    martes, 28 de noviembre de 2017 15:45
  • Buenas Ruben,

    Si que ha cambiado un poquito, el tema es que

     row.DataBoundItem

    devuelve el item que se le cargo, entonces, como ahora quieres cargarle 2 datos, en vez de un List<string>, he añadido una clase Datos, para hacer un List<Datos>, de modo que tengas las 2 strings (o si el dia de mañana quieres añadir nuevas columnas, las puedas añadir comodamente).

    Te dejo el codigo:

    class Datos
    {
      public string strReferencia { get; set; }
      public string strDescipcion { get; set; }
    }
    
    private void CargarDGV()
    {
      //No queremos que se generen nuevas columnas
      dataGridView1.AutoGenerateColumns = false;
    
      //Este es el path de las imagenes, el {0} es importante ya que luego se rremplaza con string.Format dejando en su lugar el nombre
      string strFolder = "E:\\Imagenes\\{0}.jpg";
    
      //Lee una lista desde la DB y la asigna al datagridview
      dataGridView1.DataSource = leerBD();
    
    
      //Recorremos el datagridview
      foreach (DataGridViewRow row in dataGridView1.Rows)
      {
        //Obtenemos el item Boundeado a la row como string (porque hemos cargado un List<Datos>)
        Datos currentDatos = row.DataBoundItem as Datos;
    
        if (currentDatos != null)
        {
          //Añadimos el nombre a la columna 0
          row.Cells[0].Value = currentDatos.strReferencia;
          row.Cells[1].Value = currentDatos.strDescipcion;
          //Añadimos la imagen a la columna 1
          if (File.Exists(string.Format(strFolder, currentDatos.strReferencia)))
            row.Cells[2].Value = new Bitmap(string.Format(strFolder, currentDatos.strReferencia));
          else
            row.Cells[2].Value = new Bitmap(string.Format(strFolder, "Default"));
        }
      }
    
    }
    
    private List<Datos> leerBD()
    {
      List<Datos> ret = new List<Datos>();
    
      using (MySqlConnection cnoficina = new MySqlConnection(CadenaConexionNAV))
      {
        //Abre la conexion
        cnoficina.Open();
        //Consulta
        string queryoficina = @"select noproducto, descprod from productos limit 10";
        //definimos el comando
        using (MySqlCommand cmd = new MySqlCommand(queryoficina, cnoficina))
        { //definimos el reader
          using (MySqlDataReader reader = cmd.ExecuteReader())
          { //leemos todo el contenido
            while (reader.Read())
            { //añadimos a la lista todos los items
              ret.Add(new Datos() { strReferencia = reader.GetString(0), strDescipcion = reader.GetString(1) });
            }
          }
        }
      }
      return ret;
    }

    Para usarlo, debes tener en el datagridview 3 columnas, la 0 y la 1 de tipo texto, y la dos de tipo imagen

    Y el resultado es este

    Si quieres añadir campos, simplemente, añades la columna al datagridview, añades la propiedad a la clase Datos, y añades la lectura en el select, con eso, cuando llames al objeto Datos del BoundingItem, tendras ese nuevo dato para ponerlo tambien

    Si tienes dudas comentanos

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 16:57
    martes, 28 de noviembre de 2017 16:14
  • Perfecto genial grande Maestro

    solo tengo un error si no existe me sale eso

    pero si existe toas las imagenes funciona de mil maravillas

    saludos


    ruben

    martes, 28 de noviembre de 2017 16:24
  • Buenas Ruben,

    Existe la imagen 

     "E:\\Imagenes\\Default.jpg";

    ¿?

    Eso esta puesto porque me comentaste que si no existia, querias cargar una imagen Default, asi que suspuse que se llamaria Default.jpg...

    Coje la imagen que quieres mostrar si la que le corresponde no existe, llamada "Default.jpg" y metela en "E\Imagenes\",

    Nos comentas el resultado

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 16:57
    martes, 28 de noviembre de 2017 16:41
  • :) si se me olvido ponerlo ajajajajajajajajjaja

    Grande Maestro grande, que mas puedo decir eres genio

    saludos


    ruben

    • Marcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 16:57
    • Desmarcado como respuesta Ruben Lezcano martes, 28 de noviembre de 2017 16:57
    martes, 28 de noviembre de 2017 16:57
  • Jorge puedo agrandar la imagen con un doble click?

    es otro hilo? 

    saludos


    ruben

    martes, 28 de noviembre de 2017 16:59
  • Mejor otro hilo, 

    Este esta respondido y con muchas respuestas, poco probable que alguien lo mire

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    martes, 28 de noviembre de 2017 17:07