none
Pintar filas de grilla RRS feed

  • Pregunta

  • Hola a todos ! Estoy teniendo un problema algo raro: tengo un formulario con un TabControl, el cual contiene 2 TabPages. En la segunda solapa, tengo un datagridview. En el load del form, llamo a un metodo para pintar las filas del datagridview (rojas o azules, segun condicion) El metodo se ejecuta, pero no logro que me pinte las filas. El problema, segun lo visto, es porque el datagridview esta en la segunda solapa. Probe con ponerlo en la primer solapa, y anduvo muy bien. Por que se puede dar esto ? Lo solucione poniendo activa la solapa 2 y luego volviendo a poner activa la 1, pero no me gusta esa solucion. No creo que sea lo correcto. Algo me debe estar faltando ..

    Gracias !

    • Cambiado Enrique M. Montejo sábado, 30 de junio de 2012 17:57 Controles de Windows Forms (De:Lenguaje VB.NET)
    viernes, 11 de mayo de 2012 13:36

Todas las respuestas

  • Por que se puede dar esto ?

    en que evento estas cargando los registros del grid ? es en el Page_Load,si solo cargas los datos, sin asignar color ni nada, cuando vas al tab2 visualizas los registros ? porque si los visualizas, entocnes accedes al control de forma corrrecta

    de que forma asignas el color, es con el evento CellFormatting ? si es asi no lo uses

    despeus de asignar el DataSource del control realiza un For Each por cada row y alli define la logica del control

    DataGridView1.DataSource = dt

    For Each row As DataGridViewRow In DataGridView1.Rows

       'aqui logica de color

    Next

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 11 de mayo de 2012 14:58
  • Leandro, muchas gracias por tu respuesta. Te comento:

    Luego de aplicar el controlSource a la grilla, recorro las filas y pinto los datos.

     For i As Integer = 0 To dtgDatos.Rows.Count - 1
                If Val(dtgDatos.Item(15, i).Value) = 3 Then
                    dtgDatos.Rows(i).DefaultCellStyle.ForeColor = Color.Blue
                Else
                    dtgDatos.Rows(i).DefaultCellStyle.ForeColor = Color.Red
                End If
            Next
    El metodo que realiza el llenado de los datos de la grilla, lo llamo en el Form_Load. Cuando voy a la segunda pestaña, los registros los visualizo correctamente (pero no los colores). Ahi puse un boton, que llama al metodo que pinta las filas, y en ese momento las filas se pintan correctamente. En fin, para que se pinten, debo tener la pestaña activa. Sabes como puedo solucionar esto ? Muchas gracias !
    viernes, 11 de mayo de 2012 18:58
  • entonces claramente aplica el formato si esta activo el tab, porque si el boton aplica el color

    que pasa si este boton lo pones pero en el tab1, no activas el tab2

    y desde el tab1 presionas el boton, cuando realiza el For aplica el color ?

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 11 de mayo de 2012 19:07
  • Leandro, te cuento que puse el boton en la primer solapa, y al presionarlo la grilla de la solapa 2 se pinta bien.

    Resumiendo, no se pinta cuando el metodo lo llamo en el Form_Load, y estando la solapa 1 activa. Es raro el comportamiento, pero asi sucede. En el Form_Load, activo la solapa 2 y luego vuelvo a activar la 1. Asi, la grilla se pinta. Es la unica manera

    viernes, 11 de mayo de 2012 19:31
  • Hola:
    En un Form con 1 TabControl con dos TabPages.
    El Tabpage2 contiene 1 DataGridView.
    Copia y pega el siguiente codigo:

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient

    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                ' Configuramos una conexión con el origen de datos.
                Using loConexion As New SqlConnection(msCadenaSQL)
                    ' crear adaptadores
                    Dim loDataAdapter As New SqlDataAdapter("SELECT * FROM Customers", loConexion)
                    Dim moDataTable As New DataTable()
                    loDataAdapter.Fill(moDataTable)
                    Me.DataGridView1.DataSource = moDataTable
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            Me.TabControl1.Dock = DockStyle.Fill
            Me.DataGridView1.Dock = DockStyle.Fill
            Me.WindowState = FormWindowState.Maximized
        End Sub

        Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
            If IsNothing(e.Value) = True Then
                Exit Sub
            End If
            If Me.DataGridView1.Columns("Country").Index = e.ColumnIndex Then
                Dim sTextoCelda As String = String.Empty
                sTextoCelda = CType(e.Value, String)

                Select Case sTextoCelda
                    Case "Spain"
                        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LightSkyBlue
                    Case "France"
                        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LightSalmon
                    Case "USA"
                        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LightPink
                    Case "Germany"
                        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Beige
                    Case "Venezuela"
                        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.GreenYellow

                End Select
            End If
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos

    lunes, 14 de mayo de 2012 9:34
  • Hola

    Pues yo lo e probado y funciona bien, un dataGridView en la 2 solapa de un tabControl, la primera solapa estando activo, y lo pinto desde el evento load del form.

    Una pregunta, Las lineas las pintas una vez cargado los datos de dataGridView?


    • Editado ToniAG lunes, 14 de mayo de 2012 11:04
    lunes, 14 de mayo de 2012 11:02
  • ToniAG, muchas gracias por tu respuesta. Si, te cuento que las lineas las pinto una vez cargado los datos. El datagridview lo tengo dentro de un groupbox en la solapa2. Siguiendo el codigo con el depurador, el metodo es invocado y las filas se pintan. Pero al ir a la segunda solapa, no las encuentro pintadas. En el Load, llamo a un metodo CargarGrilla(), y luego a otro PintarFilas(). Todo pareceria estar bien, pero al ir a la segunda solapa no veo cambios.
    lunes, 14 de mayo de 2012 13:19
  • Hola lo e probado tambien con el groupBox y funciona, solo me se ocurre una cosa, que por alguna razon el dataGridView vuelve a refrescar los datos con la consecuencia que elimina las lineas y las vuelve a crear, prueba a rellenar los datos manualmente tal cual solo para ver que pasa

    for i as integer=0 to 10

         Me.DataGridView1.Rows.Add("campo1", "campo2, "campo3")

    next

    y quita el es linea Me.DataGridView1.DataSource = moDataTable, para que no coja datos de la base de datos

    cuenta que pasa



    • Editado ToniAG lunes, 14 de mayo de 2012 13:41
    lunes, 14 de mayo de 2012 13:35
  • Prueba a pintar las lineas en el evento DataBindingComplete segun su descripción:

    Este evento se produce cuando cambia el contenido del origen de datos o cuando cambia el valor de la propiedad DataSource, DataMember o BindingContext.
    Por ejemplo, controlar este evento es útil para cambiar mediante programación el tamaño de filas y columnas a partir de actualizaciones de contenido.




    • Editado ToniAG lunes, 14 de mayo de 2012 13:48
    lunes, 14 de mayo de 2012 13:46