none
como almacenar un color en sql con vb.net 2010 RRS feed

  • Pregunta

  • estoy haciendo una aplicacion que pone el valor de un color en un label a travez de un colordialog quisiera grabar en la base de datos en valor de ese color de alguna manera, alguien tiene alguna respuesta..... gracias

    domingo, 16 de junio de 2013 12:40

Respuestas

  • "Efrain Diaz" preguntó:

    > lo que necesito saber es que codigo debo utilizar para
    > llevar el ID color(int) y el backcolor del lblcolor
    > (varchar) a una base de datos sql

    Hola, Efrain:

    En cuanto a guardar el color en un archivo o en una base de datos, tendrás que guardar el valor entero (Integer) del color, por tanto el tipo de dato del campo de la tabla no puede ser varchar; mejor será que los dos campos tengan el tipo de dato int.

    Y para obtener el valor Integer de una estructura Color simplemente tienes que llamar a su método ToArgb, tal y como muestra el siguiente ejemplo:

            Dim valorEnteroColor As Integer
    
            Using c As New ColorDialog()
                Dim dr As DialogResult = c.ShowDialog()
                If (dr = DialogResult.Cancel) Then Return
                ' Obtenemos el valor entero del color seleccionado
                valorEnteroColor = c.Color.ToArgb()
            End Using
    
            ' Procedemos llamar al procedimiento que graba
            ' los datos en la base de datos.
            '
            GuardarDatos(valorEnteroColor)

    Ese 'valorEnteroColor' definido como Integer es el que tienes que guardar en la base de datos, acción esta que doy por sentado que conoces cómo se hace.

    > y como puedo recuperarlo despues si quiero
    > navegar por los distintos records

    Cuando recuperes el valor Integer de la base de datos, lo convertirías a una estructura Color de ésta manera:

        Dim valorRecuperado As Integer = ObtenerValorBaseDatos()
    
        Label1.BackColor = Color.FromArgb(valorRecuperado)

    Por supuesto, tendrás que tener un procedimiento (yo le he llamado ObtenerValorBaseDatos) para recuperar el valor Integer del color existente en la base de datos, cuestión que también doy por hecho que sabes cómo se hace. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 17 de junio de 2013 22:05
    Moderador
  • "Efrain Diaz" me preguntó:

    > Enrique pude almacenar con el metodo color.fromName usando este codigo,
    >
    > Dim colores As String
    > colores = Color.FromName(Label2.BackColor.Name).ToString

    Pero con ese código vas a tener un MONTÓN DE PROBLEMAS. Ahora bien, si tu intención es complicarte la vida, pues me parece bien que entonces obtengas el nombre del color de esa manera. :-D

    Lo primero, para obtener el nombre del color, de nada te sirve el método ToString de una estructura Color, porque si tu intención es guardar el NOMBRE DEL COLOR CONOCIDO, lo puedes hacer así:

       Dim colores As String = Label2.BackColor.Name

    Es decir, no tienes ni que hacer uso del método compartido FromName.

    Pero también te comento que no todos los colores existentes en el cuadro de diálogo Color tienen un nombre de color conocido en la enumeración KnowColor, por tanto, si el usuario selecciona un color que no tiene un nombre de color conocido, posteriormente vas a tener problemas para asignar un color cuyo nombre no existe. Es por éste motivo por lo que anteriormente te comenté que lo CORRECTO es guardar el valor Integer del color, no su nombre.

    > digame por favor si cree que esta bien hecho, ...

    En mi opinión personal todo ese código que has publicado es mejorable.

    Como a mí no me gusta PERDER EL TIEMPO, yo te voy a explicar lo que yo haría, que sería definir el campo Color de la tabla Colores de la base de datos con el tipo de dato INT. ¿Que tú deseas continuar guardando el nombre del color? Me parece estupendo pero entonces no me preguntes más, porque como bien creo que podrás comprender, si yo te estoy diciendo que vas a tener problemas y tú te empeñas en tenerlos, todo lo que yo te diga son ganas de perder el tiempo tontamente. La pregunta sería ¿quieres aprender o no quieres aprender a guardar un color en la base de datos?

    Suponiendo que el tipo de dato Color de la tabla lo has modificado al tipo INT, utilizarías el siguiente procedimiento para insertar un nuevo registro en tu tabla Colores:

        Friend Sub Insertar_Nuevo(idColor As Integer, color As Integer)
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "INSERT INTO Colores(IdColor, Color) VALUES (@idcolor, @color)"
                cmd.Parameters.AddWithValue("@idcolor", idColor)
                cmd.Parameters.AddWithValue("@color", color)
                cnn.Open()
                cmd.ExecuteNonQuery()
            End Using
    
        End Sub

    Se comprende que la variable cadenaConexion hace referencia a la cadena de conexión que estás utilizando para conectarte con tu base de datos de SQL Server.

    Y cuando desees añadir un nuevo registro, llamarías al procedimiento Insertar_Nuevo de la siguiente manera:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Obtenemos el valor entero del Color correspondiente
                ' a la propiedad BackColor de la etiqueta.
                '
                Dim valorColor As Integer = Label2.BackColor.ToArgb()
    
                ' Comprobamos si se ha escrito un valor Integer
                ' en el control TextBox1.
                '
                Dim idColor As Integer
                Dim bln As Boolean = Integer.TryParse(TextBox1.Text, idColor)
    
                If (Not (bln)) Then
                    MessageBox.Show("El identificador del color no es correcto.")
                    TextBox1.Clear()
                    Return
                End If
    
                ' Los datos son correctos; procedemos a insertar
                ' el nuevo registro.
                '
                Insertar_Nuevo(idColor, valorColor)
    
                MessageBox.Show("Registro guardado.")
    
            Catch ex As Exception
                ' Se ha producido un error.
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Esta es la manera "CERTIFICADA" de guardar un Color en una base de datos; todo lo demás son ganas de perder el tiempo. ;-)

    Ahora, para recuperar los colores guardados en tu tabla, utilizarías la siguiente función:

        Friend Function ObtenerColores() As DataTable
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "SELECT * FROM Colores"
                Dim da As New SqlDataAdapter(cmd)
                Dim dt As New DataTable()
                da.Fill(dt)
                Return dt
            End Using
           
        End Function

    No creo que tenga que repetir lo que significa la variable llamada cadenaConexion.

    Y para rellenar de datos el control DataGridView, llamarias a la función ObtenerColores de la siguiente manera:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            Try
                ' Obtenemos el objeto DataTable con los colores
                '
                Dim dt As DataTable = ObtenerColores()
    
                ' Lo enlazamos con el control DataGridView
                '
                DataGridView1.DataSource = dt
    
            Catch ex As Exception
                ' Se ha procudido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Por supuesto, no esperes que te aparezcan en el control DataGridView los nombres de los colores, porque lo que hemos guardado ha sido su valor Integer, ya que te repito que el nombre del color no te sirve para nada, sobre todo si vas a guardar colores que no tienen un nombre de color conocido.

    > como puedo recorrer el datagridview con el evento click
    > y que me muestre el id y tambien el color

    Si el color se lo vas a asignar a la propiedad BackColor de un control Label, por poner un ejemplo, no tienes que recorrer todos los registros existentes en el control DataGridView; con asignarle el color correspondiente al registro actualmente seleccionado en dicho control, entiendo que es suficiente. Y para ello podrías hacer uso del evento RowEnter del control DataGridView para que el control Label2 vaya cambiando de color conforme haces clic con el ratón en alguna fila del control DataGridView, o te mueves por él mediante las teclas de dirección:

        Private Sub DataGridView1_RowEnter( _
            sender As Object, _
            e As DataGridViewCellEventArgs) _
            Handles DataGridView1.RowEnter
    
            Dim row As DataGridViewRow = DataGridView1.CurrentRow
            If (row Is Nothing) Then Return
    
            ' Valor de la primera columna
            '
            Dim value As String = Convert.ToString(row.Cells(0).Value)
    
            ' Si el valor de la celda es Nothing o DBNull.Value, el
            ' método Convert.ToString no devolverá una cadena de
            ' longitud cero; en caso contrario nos devolverá el
            ' valor alfanumérico de la celda.
            '
            TextBox1.Text = value
    
            ' Valor de la segunda columna, que se supone es la que
            ' guarda el valor Integer del color.
            '
            value = Convert.ToString(row.Cells(1).Value)
    
            If (value <> String.Empty) Then
                Label2.BackColor = Color.FromArgb(Convert.ToInt32(value))
            End If
    
        End Sub

    > el problema que he tenido cuando estoy recorriendo los rows
    > de un datagridview con el evento click es que cuando los
    > valores int, double, datetime y otros que no son de tipo
    > texto cuando esos valores estan null o sea que no tienen
    > nada escrito me salta una excepcion ...

    Si no deseas verificar explícitamente el posible valor Nothing o DBNull.Value de la celda del control DataGridView cuyo valor deseas recuperar, tienes que hacer uso del método Convert.ToString, tal y como así explico en el comentario que aparece en el evento RowEnter mostrado más arriba.

    Repito que si tu empeño es guardar el nombre del color, te agradecería que no me preguntases más, porque todo lo que te tenía que decir creo que ya te lo he dicho, y ¡con creces! ;-)

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    martes, 18 de junio de 2013 4:24
    Moderador
  • "Efrain Diaz" preguntó:

    > cual es el procedimiento si quiero crear un boton para
    > actualizar esos datos, por ejemplo si quisiera cambiar
    > el color del label, gracias

    Me imagino que te referirás a ejecutar una consulta T-SQL de actualización (UPDATE) en tu tabla de Colores. Si es así, tendrías que hacerte de algún manual para estudiar cómo se ejecutan consultas T-SQL desde una aplicación de Visual Basic.

    El procemiento sería prácticamente el mismo que el procedimiento Insertar_Nuevo, pero en lugar de ejecutar una consulta INSERT INTO, tendrías que adaptarlo para ejecutar una consulta UPDATE.

    Inserta en tu clase o módulo el siguiente procedimiento:

        Friend Sub ActualizarColor(idColor As Integer, nuevoColor As Integer)
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "UPDATE Colores SET Color=@color WHERE IdColor=@idcolor"
                cmd.Parameters.AddWithValue("@color", nuevoColor)
                cmd.Parameters.AddWithValue("@idcolor", idColor)
                cnn.Open()
                cmd.ExecuteNonQuery()
            End Using
    
        End Sub

    Fíjate que aquí lo único que hacemos es modificar el valor del campo Color que se corresponda con el identificador de color especificado, el campo IdColor, el cual no se modificará.

    Y desde el botón correspondiente lo llamarías de la siguiente manera:

        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    
            Try
                ' Obtenemos el valor entero del Color correspondiente
                ' a la propiedad BackColor de la etiqueta.
                '
                Dim nuevoColor As Integer = Label2.BackColor.ToArgb()
    
                ' Comprobamos si se ha escrito un valor Integer
                ' en el control TextBox1.
                '
                Dim idColor As Integer
                Dim bln As Boolean = Integer.TryParse(TextBox1.Text, idColor)
    
                If (Not (bln)) Then
                    MessageBox.Show("El identificador del color no es correcto.")
                    TextBox1.Clear()
                    Return
                End If
    
                ' Los datos son correctos; procedemos a actualizar
                ' el registro cuyo identificador se corresponda
                ' con el escrito en el control TextBox1.
    
                ActualizarColor(idColor, nuevoColor)
    
                MessageBox.Show("Registro guardado.")
    
            Catch ex As Exception
                ' Se ha producido un error.
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si por casualidad mañana me vas a preguntar por eliminar un registro de tu tabla Colores, me anticipo a decirte que te construyas otro procedimiento donde deberás ejecutar la siguiente consulta T-SQL de eliminación:

        cmd.CommandText = "DELETE FROM Colores WHERE IdColor=@idcolor"

    En éste caso solamente deberás de añadir un único parámetro, que se corresponderá con el identificador del registro (el campo IdColor) que deseas eliminar.

    Esto es cuestión de hacerte de algún libro, manual, artículo, o lo que sea, para que por tí mismo aprendas a ejecutar consultas T-SQL, porque si te dedicas a preguntar y a copiar el ejemplo, poco vas a aprender. :-(


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 19 de junio de 2013 18:38
    Moderador
  • "Efrain Diaz" escribió:

    > Enrique mi problema es que cuando estoy recorriendo la grilla
    > para que me muestre en los textbox, si hay algun campo null
    > que sea de tipo integer, datetime, o cualquier otro que no
    > sea de tipo texto me salta esta excepcion, ...

    ¡Jeje! Con el mundo de la programación tienes más de un problema y de diversa índole, siendo la causa común de todos el que deseas hacer ciertas cosas teniendo un desconocimiento total de cómo se hace. Discúlpame que te lo diga así, pero flaco favor te haría si me lo callase.

    Al final pasa lo de siempre: comienzas la conversación por un tema (almacenar colores) y al final acabamos hablando de otros temas que no tienen nada que ver con el tema inicial (errores de conversión de datos). Como te he indicado en otras ocasiones, tienes que iniciar una nueva pregunta o conversación por cada problema que tengas y no englobarlos todos en la misma conversación.

    El error que obtienes al querer convertir a String un valor DBNull.Value, en mi segunda respuesta te indiqué lo que tenías que hacer para no obtener dicho error, pero parece ser que te has limitado a copiar/pegar y ni tan siquiera has leído los comentarios.

    Si te fijas bien en los comentarios que aparecen en el código fuente del evento RowEnter del control DataGridView, allí podrás leer lo siguiente:

            ' Valor de la primera columna
            '
            Dim value As String = Convert.ToString(row.Cells(0).Value)
            ' Si el valor de la celda es Nothing o DBNull.Value, el
            ' método Convert.ToString no devolverá una cadena de
            ' longitud cero; en caso contrario nos devolverá el
            ' valor alfanumérico de la celda.

    Es decir, en lugar de utilizar la función de conversión CStr, tienes que hacer uso del método ToString de la clase Convert, lo cual te aconsejo que hagas cuando desees convertir a String cualquier valor existente en el control DataGridView o en un objeto DataRow:

     Private Sub datagridlista_RowEnter( _
      sender As Object, _
      e As DataGridViewCellEventArgs) _
      Handles datagridlista.RowEnter
      
      ' Referenciamos la fila que ha desencadenado el evento
      ' 
      Dim row As DataGridViewRow = Me.datagridlista.Rows(e.RowIndex)
      
      ' Si el valor es Nothing, abandonamos el procedimiento
      '
      If (row Is Nothing) Then Return
      
      ' Pasamos los valores de las distintas columnas a su
      ' correspondiente control TextBox mediante el método
      ' ToString de la clase Convert.
      '
      Me.txtproveedor.Text = Convert.ToString(row.Cells(0).Value)
      Me.txtnombre.Text = Convert.ToString(row.Cells(1).Value)
      Me.txtdireccion.Text = Convert.ToString(row.Cells(2).Value)
      Me.mtbcodigopostal.Text = Convert.ToString(row.Cells(3).Value)
      Me.txtpueblociudad.Text = Convert.ToString(row.Cells(4).Value)
      Me.mtbtelefono.Text = Convert.ToString(row.Cells(5).Value)
      Me.mtbfax.Text = Convert.ToString(row.Cells(6).Value)
      Me.txtemail.Text = Convert.ToString(row.Cells(7).Value)
      Me.txtformapago.Text = Convert.ToString(row.Cells(8).Value)
      Me.txtdescuento.Text = Convert.ToString(row.Cells(9).Value)
      
     End Sub

    Fíjate que en lugar de utilizar el evento Click estoy haciendo uso del evento RowEnter, de ésta manera se desencadenará el evento cuando hagas clic sobre cualquier celda o cuando cambies de fila mediante las teclas de dirección, cosa que no sucederá si sigues empeñado en utilizar el evento Click. Por supuesto, si no vas a seguir utilizando el evento Click deberás de eliminar el código del mismo.

    En principio, mientras que los valores de las celdas se puedan convertir a String, no vas a obtener ningún error, de ahí que haya eliminado también el bloque Try...End Try.

    Me imagino que estarás anotando en tu cuaderno de apuntes todas las indicaciones que te estoy haciendo llegar, para que las puedas consultar cuando las necesites. ;-)


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marcado como respuesta Efrain Diaz jueves, 20 de junio de 2013 23:54
    jueves, 20 de junio de 2013 6:41
    Moderador

Todas las respuestas

  • podrias grabarlo por su nombre en un campo varchar

    ya que despues hacer

    Color.FromName (Método)

    para asignarlo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 16 de junio de 2013 12:51
  • Leandro lo que necesito saber es que codigo debo utilizar para llevar el ID color(int) y el backcolor del lblcolor (varchar) a una base de datos sql por que no entendi bien lo que debo poner en el metodo y como puedo recuperarlo despues si quiero navegar por los distintos records, gracias

    lunes, 17 de junio de 2013 21:03
  • "Efrain Diaz" preguntó:

    > lo que necesito saber es que codigo debo utilizar para
    > llevar el ID color(int) y el backcolor del lblcolor
    > (varchar) a una base de datos sql

    Hola, Efrain:

    En cuanto a guardar el color en un archivo o en una base de datos, tendrás que guardar el valor entero (Integer) del color, por tanto el tipo de dato del campo de la tabla no puede ser varchar; mejor será que los dos campos tengan el tipo de dato int.

    Y para obtener el valor Integer de una estructura Color simplemente tienes que llamar a su método ToArgb, tal y como muestra el siguiente ejemplo:

            Dim valorEnteroColor As Integer
    
            Using c As New ColorDialog()
                Dim dr As DialogResult = c.ShowDialog()
                If (dr = DialogResult.Cancel) Then Return
                ' Obtenemos el valor entero del color seleccionado
                valorEnteroColor = c.Color.ToArgb()
            End Using
    
            ' Procedemos llamar al procedimiento que graba
            ' los datos en la base de datos.
            '
            GuardarDatos(valorEnteroColor)

    Ese 'valorEnteroColor' definido como Integer es el que tienes que guardar en la base de datos, acción esta que doy por sentado que conoces cómo se hace.

    > y como puedo recuperarlo despues si quiero
    > navegar por los distintos records

    Cuando recuperes el valor Integer de la base de datos, lo convertirías a una estructura Color de ésta manera:

        Dim valorRecuperado As Integer = ObtenerValorBaseDatos()
    
        Label1.BackColor = Color.FromArgb(valorRecuperado)

    Por supuesto, tendrás que tener un procedimiento (yo le he llamado ObtenerValorBaseDatos) para recuperar el valor Integer del color existente en la base de datos, cuestión que también doy por hecho que sabes cómo se hace. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 17 de junio de 2013 22:05
    Moderador
  • Enrique pude almacenar con el metodo color.fromName usando este codigo, ahora bien como puedo recorrer el datagridview con el evento click y que me muestre el id y tambien el color, de eso no tengo ni la mas minima idea y digame por favor si cree que esta bien hecho, por que el problema que he tenido cuando estoy recorriendo los rows de un datagridview con el evento click es que cuando los valores int, double, datetime y otros que no son de tipo texto cuando esos valores estan null o sea que no tienen nada escrito me salta una excepcion y no he podido dar con el error ahora si los tipos de datos son texto no hay ningun problema aunque esten null los campo y se que hay que ponerlos acept null cuando uno crea la base de datos eso lo tengo muy claro, como me puede ayudar, gracias

    Public Sub Insertar_Nuevo()
            Try
                Dim arrfilename() As String = Split(Text, "\")
                Array.Reverse(arrfilename)
    
                Dim colores As String
                colores = Color.FromName(Label2.BackColor.Name).ToString
    
                Dim cmd As New SqlCommand("Insert Into Colores(idcolor,color)Values(@idcolor,@color)", cn)
                With cmd
                    .Parameters.Add(New SqlParameter("@idcolor", SqlDbType.Int)).Value = Me.TextBox1.Text
                    .Parameters.Add(New SqlParameter("@color", SqlDbType.NVarChar, 50)).Value = colores
                End With
                cn.Open()
                cmd.ExecuteNonQuery()
                cn.Close()
                MsgBox("Registro Guardado")
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    1	Color [ffffff80]
    NULL	NULL


    lunes, 17 de junio de 2013 23:52
  • como puedo recorrer el datagridview con el evento click y que me muestre el id y tambien el color

    pero porque recorrer simplemente tomas la seleccion y la muestras

    lo que no entiendo es porque en la celda has peusto Color [] eso esta de mas

    Private Sub datagrisdview1_click(..)

       Dim row As DatagridViewRow =  DataGridView1.CurrentRow

       txtIdColor.Text = CStr(row.Cells(0).Value)

       Picturebox1.Backcolor = Color.FromName(CStr(row.Cells(1).Value))

    End Sub

    pero apra que funcione elimina el Color [] que has puesto en la celda


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 18 de junio de 2013 1:07
  • "Efrain Diaz" me preguntó:

    > Enrique pude almacenar con el metodo color.fromName usando este codigo,
    >
    > Dim colores As String
    > colores = Color.FromName(Label2.BackColor.Name).ToString

    Pero con ese código vas a tener un MONTÓN DE PROBLEMAS. Ahora bien, si tu intención es complicarte la vida, pues me parece bien que entonces obtengas el nombre del color de esa manera. :-D

    Lo primero, para obtener el nombre del color, de nada te sirve el método ToString de una estructura Color, porque si tu intención es guardar el NOMBRE DEL COLOR CONOCIDO, lo puedes hacer así:

       Dim colores As String = Label2.BackColor.Name

    Es decir, no tienes ni que hacer uso del método compartido FromName.

    Pero también te comento que no todos los colores existentes en el cuadro de diálogo Color tienen un nombre de color conocido en la enumeración KnowColor, por tanto, si el usuario selecciona un color que no tiene un nombre de color conocido, posteriormente vas a tener problemas para asignar un color cuyo nombre no existe. Es por éste motivo por lo que anteriormente te comenté que lo CORRECTO es guardar el valor Integer del color, no su nombre.

    > digame por favor si cree que esta bien hecho, ...

    En mi opinión personal todo ese código que has publicado es mejorable.

    Como a mí no me gusta PERDER EL TIEMPO, yo te voy a explicar lo que yo haría, que sería definir el campo Color de la tabla Colores de la base de datos con el tipo de dato INT. ¿Que tú deseas continuar guardando el nombre del color? Me parece estupendo pero entonces no me preguntes más, porque como bien creo que podrás comprender, si yo te estoy diciendo que vas a tener problemas y tú te empeñas en tenerlos, todo lo que yo te diga son ganas de perder el tiempo tontamente. La pregunta sería ¿quieres aprender o no quieres aprender a guardar un color en la base de datos?

    Suponiendo que el tipo de dato Color de la tabla lo has modificado al tipo INT, utilizarías el siguiente procedimiento para insertar un nuevo registro en tu tabla Colores:

        Friend Sub Insertar_Nuevo(idColor As Integer, color As Integer)
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "INSERT INTO Colores(IdColor, Color) VALUES (@idcolor, @color)"
                cmd.Parameters.AddWithValue("@idcolor", idColor)
                cmd.Parameters.AddWithValue("@color", color)
                cnn.Open()
                cmd.ExecuteNonQuery()
            End Using
    
        End Sub

    Se comprende que la variable cadenaConexion hace referencia a la cadena de conexión que estás utilizando para conectarte con tu base de datos de SQL Server.

    Y cuando desees añadir un nuevo registro, llamarías al procedimiento Insertar_Nuevo de la siguiente manera:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Obtenemos el valor entero del Color correspondiente
                ' a la propiedad BackColor de la etiqueta.
                '
                Dim valorColor As Integer = Label2.BackColor.ToArgb()
    
                ' Comprobamos si se ha escrito un valor Integer
                ' en el control TextBox1.
                '
                Dim idColor As Integer
                Dim bln As Boolean = Integer.TryParse(TextBox1.Text, idColor)
    
                If (Not (bln)) Then
                    MessageBox.Show("El identificador del color no es correcto.")
                    TextBox1.Clear()
                    Return
                End If
    
                ' Los datos son correctos; procedemos a insertar
                ' el nuevo registro.
                '
                Insertar_Nuevo(idColor, valorColor)
    
                MessageBox.Show("Registro guardado.")
    
            Catch ex As Exception
                ' Se ha producido un error.
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Esta es la manera "CERTIFICADA" de guardar un Color en una base de datos; todo lo demás son ganas de perder el tiempo. ;-)

    Ahora, para recuperar los colores guardados en tu tabla, utilizarías la siguiente función:

        Friend Function ObtenerColores() As DataTable
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "SELECT * FROM Colores"
                Dim da As New SqlDataAdapter(cmd)
                Dim dt As New DataTable()
                da.Fill(dt)
                Return dt
            End Using
           
        End Function

    No creo que tenga que repetir lo que significa la variable llamada cadenaConexion.

    Y para rellenar de datos el control DataGridView, llamarias a la función ObtenerColores de la siguiente manera:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            Try
                ' Obtenemos el objeto DataTable con los colores
                '
                Dim dt As DataTable = ObtenerColores()
    
                ' Lo enlazamos con el control DataGridView
                '
                DataGridView1.DataSource = dt
    
            Catch ex As Exception
                ' Se ha procudido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Por supuesto, no esperes que te aparezcan en el control DataGridView los nombres de los colores, porque lo que hemos guardado ha sido su valor Integer, ya que te repito que el nombre del color no te sirve para nada, sobre todo si vas a guardar colores que no tienen un nombre de color conocido.

    > como puedo recorrer el datagridview con el evento click
    > y que me muestre el id y tambien el color

    Si el color se lo vas a asignar a la propiedad BackColor de un control Label, por poner un ejemplo, no tienes que recorrer todos los registros existentes en el control DataGridView; con asignarle el color correspondiente al registro actualmente seleccionado en dicho control, entiendo que es suficiente. Y para ello podrías hacer uso del evento RowEnter del control DataGridView para que el control Label2 vaya cambiando de color conforme haces clic con el ratón en alguna fila del control DataGridView, o te mueves por él mediante las teclas de dirección:

        Private Sub DataGridView1_RowEnter( _
            sender As Object, _
            e As DataGridViewCellEventArgs) _
            Handles DataGridView1.RowEnter
    
            Dim row As DataGridViewRow = DataGridView1.CurrentRow
            If (row Is Nothing) Then Return
    
            ' Valor de la primera columna
            '
            Dim value As String = Convert.ToString(row.Cells(0).Value)
    
            ' Si el valor de la celda es Nothing o DBNull.Value, el
            ' método Convert.ToString no devolverá una cadena de
            ' longitud cero; en caso contrario nos devolverá el
            ' valor alfanumérico de la celda.
            '
            TextBox1.Text = value
    
            ' Valor de la segunda columna, que se supone es la que
            ' guarda el valor Integer del color.
            '
            value = Convert.ToString(row.Cells(1).Value)
    
            If (value <> String.Empty) Then
                Label2.BackColor = Color.FromArgb(Convert.ToInt32(value))
            End If
    
        End Sub

    > el problema que he tenido cuando estoy recorriendo los rows
    > de un datagridview con el evento click es que cuando los
    > valores int, double, datetime y otros que no son de tipo
    > texto cuando esos valores estan null o sea que no tienen
    > nada escrito me salta una excepcion ...

    Si no deseas verificar explícitamente el posible valor Nothing o DBNull.Value de la celda del control DataGridView cuyo valor deseas recuperar, tienes que hacer uso del método Convert.ToString, tal y como así explico en el comentario que aparece en el evento RowEnter mostrado más arriba.

    Repito que si tu empeño es guardar el nombre del color, te agradecería que no me preguntases más, porque todo lo que te tenía que decir creo que ya te lo he dicho, y ¡con creces! ;-)

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    martes, 18 de junio de 2013 4:24
    Moderador
  • Enrique no quiero ni por un momento que piense que estoy tratando de hacerle perder el tiempo, al contrario estoy para aprender de las personas que saben como usted, gracias por orientarme, voy a probar este codigo que me a provisto y si tengo alguna duda espero pueda contestarmela, estoy sumamente interesado en aprender todo lo que pueda, gracias por su ayuda
    martes, 18 de junio de 2013 15:05
  • Todo me funciono perfectamente, ahora bien cual es el procedimiento si quiero crear un boton para actualizar esos datos, por ejemplo si quisiera cambiar el color del label, gracias
    miércoles, 19 de junio de 2013 12:11
  • tambien quisiera saber si existieran otros campos en mi table, tipo varchar u otros como trabajaria el sub del boton1_click y si quisiera actualizar los datos, ejemplo cambiar de color etc que procedimiento usaria
    miércoles, 19 de junio de 2013 12:57
  • "Efrain Diaz" preguntó:

    > cual es el procedimiento si quiero crear un boton para
    > actualizar esos datos, por ejemplo si quisiera cambiar
    > el color del label, gracias

    Me imagino que te referirás a ejecutar una consulta T-SQL de actualización (UPDATE) en tu tabla de Colores. Si es así, tendrías que hacerte de algún manual para estudiar cómo se ejecutan consultas T-SQL desde una aplicación de Visual Basic.

    El procemiento sería prácticamente el mismo que el procedimiento Insertar_Nuevo, pero en lugar de ejecutar una consulta INSERT INTO, tendrías que adaptarlo para ejecutar una consulta UPDATE.

    Inserta en tu clase o módulo el siguiente procedimiento:

        Friend Sub ActualizarColor(idColor As Integer, nuevoColor As Integer)
    
            Using cnn As New SqlConnection(cadenaConexion)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "UPDATE Colores SET Color=@color WHERE IdColor=@idcolor"
                cmd.Parameters.AddWithValue("@color", nuevoColor)
                cmd.Parameters.AddWithValue("@idcolor", idColor)
                cnn.Open()
                cmd.ExecuteNonQuery()
            End Using
    
        End Sub

    Fíjate que aquí lo único que hacemos es modificar el valor del campo Color que se corresponda con el identificador de color especificado, el campo IdColor, el cual no se modificará.

    Y desde el botón correspondiente lo llamarías de la siguiente manera:

        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    
            Try
                ' Obtenemos el valor entero del Color correspondiente
                ' a la propiedad BackColor de la etiqueta.
                '
                Dim nuevoColor As Integer = Label2.BackColor.ToArgb()
    
                ' Comprobamos si se ha escrito un valor Integer
                ' en el control TextBox1.
                '
                Dim idColor As Integer
                Dim bln As Boolean = Integer.TryParse(TextBox1.Text, idColor)
    
                If (Not (bln)) Then
                    MessageBox.Show("El identificador del color no es correcto.")
                    TextBox1.Clear()
                    Return
                End If
    
                ' Los datos son correctos; procedemos a actualizar
                ' el registro cuyo identificador se corresponda
                ' con el escrito en el control TextBox1.
    
                ActualizarColor(idColor, nuevoColor)
    
                MessageBox.Show("Registro guardado.")
    
            Catch ex As Exception
                ' Se ha producido un error.
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Si por casualidad mañana me vas a preguntar por eliminar un registro de tu tabla Colores, me anticipo a decirte que te construyas otro procedimiento donde deberás ejecutar la siguiente consulta T-SQL de eliminación:

        cmd.CommandText = "DELETE FROM Colores WHERE IdColor=@idcolor"

    En éste caso solamente deberás de añadir un único parámetro, que se corresponderá con el identificador del registro (el campo IdColor) que deseas eliminar.

    Esto es cuestión de hacerte de algún libro, manual, artículo, o lo que sea, para que por tí mismo aprendas a ejecutar consultas T-SQL, porque si te dedicas a preguntar y a copiar el ejemplo, poco vas a aprender. :-(


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 19 de junio de 2013 18:38
    Moderador
  • "Efrain Diaz" preguntó:

    > tambien quisiera saber si existieran otros campos en mi table,
    > tipo varchar u otros como trabajaria el sub del boton1_click

    No sé a lo que te refieres. ¿?

    > y si quisiera actualizar los datos, ejemplo cambiar de color
    > etc que procedimiento usaria

    A ésto ya te he respondido en otra pregunta.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    miércoles, 19 de junio de 2013 18:41
    Moderador
  • Enrique mi problema es que cuando estoy recorriendo la grilla para que me muestre en los textbox, si hay algun campo null que sea de tipo integer, datetime, o cualquier otro que no sea de tipo texto me salta esta excepcion, se por que es el problema pero no se como corregirlo, en este caso cuando di click en el record 4 de la grilla me salto esa excepcion y me deja los datos de forma de pago y descuento del record anterior en vez de ponermelos en blanco por que el record 4  tiene  esos campo en (blanco) null. ahi te dejo el codigo que estoy usando a ver si me ayudas, pero dejame decirte Enrique que de los insert, delete y update conozco bastante pero nunca lo habia hecho con tipos de datos que no fueran textos y ahi esta mi confusion, te deje tambien el esquema de la base de datos. gracias

    Private Sub datagridlista_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles datagridlista.Click
            Try
                If Me.datagridlista.SelectedCells(0).Value IsNot DBNull.Value Then
                    Me.txtproveedor.Text = CStr(Me.datagridlista.SelectedCells(0).Value)
                    Me.txtnombre.Text = CStr(Me.datagridlista.SelectedCells(1).Value)
                    Me.txtdireccion.Text = CStr(Me.datagridlista.SelectedCells(2).Value)
                    Me.mtbcodigopostal.Text = CStr(Me.datagridlista.SelectedCells(3).Value)
                    Me.txtpueblociudad.Text = CStr(Me.datagridlista.SelectedCells(4).Value)
                    Me.mtbtelefono.Text = CStr(Me.datagridlista.SelectedCells(5).Value)
                    Me.mtbfax.Text = CStr(Me.datagridlista.SelectedCells(6).Value)
                    Me.txtemail.Text = CStr(Me.datagridlista.SelectedCells(7).Value)
                    Me.txtformapago.Text = CStr(Me.datagridlista.SelectedCells(8).Value)
                    Me.txtdescuento.Text = CStr(Me.datagridlista.SelectedCells(9).Value)
                    End If
            Catch ex As Exception
                MsgBox(ex.ToString)
                cn.Close()
    
            End Try
        End Sub


    • Editado Efrain Diaz miércoles, 19 de junio de 2013 23:37 ayuda
    miércoles, 19 de junio de 2013 23:34
  • "Efrain Diaz" escribió:

    > Enrique mi problema es que cuando estoy recorriendo la grilla
    > para que me muestre en los textbox, si hay algun campo null
    > que sea de tipo integer, datetime, o cualquier otro que no
    > sea de tipo texto me salta esta excepcion, ...

    ¡Jeje! Con el mundo de la programación tienes más de un problema y de diversa índole, siendo la causa común de todos el que deseas hacer ciertas cosas teniendo un desconocimiento total de cómo se hace. Discúlpame que te lo diga así, pero flaco favor te haría si me lo callase.

    Al final pasa lo de siempre: comienzas la conversación por un tema (almacenar colores) y al final acabamos hablando de otros temas que no tienen nada que ver con el tema inicial (errores de conversión de datos). Como te he indicado en otras ocasiones, tienes que iniciar una nueva pregunta o conversación por cada problema que tengas y no englobarlos todos en la misma conversación.

    El error que obtienes al querer convertir a String un valor DBNull.Value, en mi segunda respuesta te indiqué lo que tenías que hacer para no obtener dicho error, pero parece ser que te has limitado a copiar/pegar y ni tan siquiera has leído los comentarios.

    Si te fijas bien en los comentarios que aparecen en el código fuente del evento RowEnter del control DataGridView, allí podrás leer lo siguiente:

            ' Valor de la primera columna
            '
            Dim value As String = Convert.ToString(row.Cells(0).Value)
            ' Si el valor de la celda es Nothing o DBNull.Value, el
            ' método Convert.ToString no devolverá una cadena de
            ' longitud cero; en caso contrario nos devolverá el
            ' valor alfanumérico de la celda.

    Es decir, en lugar de utilizar la función de conversión CStr, tienes que hacer uso del método ToString de la clase Convert, lo cual te aconsejo que hagas cuando desees convertir a String cualquier valor existente en el control DataGridView o en un objeto DataRow:

     Private Sub datagridlista_RowEnter( _
      sender As Object, _
      e As DataGridViewCellEventArgs) _
      Handles datagridlista.RowEnter
      
      ' Referenciamos la fila que ha desencadenado el evento
      ' 
      Dim row As DataGridViewRow = Me.datagridlista.Rows(e.RowIndex)
      
      ' Si el valor es Nothing, abandonamos el procedimiento
      '
      If (row Is Nothing) Then Return
      
      ' Pasamos los valores de las distintas columnas a su
      ' correspondiente control TextBox mediante el método
      ' ToString de la clase Convert.
      '
      Me.txtproveedor.Text = Convert.ToString(row.Cells(0).Value)
      Me.txtnombre.Text = Convert.ToString(row.Cells(1).Value)
      Me.txtdireccion.Text = Convert.ToString(row.Cells(2).Value)
      Me.mtbcodigopostal.Text = Convert.ToString(row.Cells(3).Value)
      Me.txtpueblociudad.Text = Convert.ToString(row.Cells(4).Value)
      Me.mtbtelefono.Text = Convert.ToString(row.Cells(5).Value)
      Me.mtbfax.Text = Convert.ToString(row.Cells(6).Value)
      Me.txtemail.Text = Convert.ToString(row.Cells(7).Value)
      Me.txtformapago.Text = Convert.ToString(row.Cells(8).Value)
      Me.txtdescuento.Text = Convert.ToString(row.Cells(9).Value)
      
     End Sub

    Fíjate que en lugar de utilizar el evento Click estoy haciendo uso del evento RowEnter, de ésta manera se desencadenará el evento cuando hagas clic sobre cualquier celda o cuando cambies de fila mediante las teclas de dirección, cosa que no sucederá si sigues empeñado en utilizar el evento Click. Por supuesto, si no vas a seguir utilizando el evento Click deberás de eliminar el código del mismo.

    En principio, mientras que los valores de las celdas se puedan convertir a String, no vas a obtener ningún error, de ahí que haya eliminado también el bloque Try...End Try.

    Me imagino que estarás anotando en tu cuaderno de apuntes todas las indicaciones que te estoy haciendo llegar, para que las puedas consultar cuando las necesites. ;-)


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marcado como respuesta Efrain Diaz jueves, 20 de junio de 2013 23:54
    jueves, 20 de junio de 2013 6:41
    Moderador
  • Gracias Enrique por la respuesta, si tengo alguna pregunta adicional la ponder como nueva pregunta, me ha servido usted de mucha utilidad
    • Propuesto como respuesta Mareli Hdz jueves, 25 de julio de 2019 17:18
    jueves, 20 de junio de 2013 23:56