Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

color de filas en datagrid

0 views
Skip to first unread message

Jose

unread,
May 18, 2006, 2:32:54 PM5/18/06
to
Estimados. Como hacer para que una o varias filas de mi datagrid muestren un
color dependiendo del status de una columna.
La idea es que si el registro es igual a 1 se pinte todo ese registro de un
color, si es igual a 2 de otro color etc.

Gracias por la ayuda.

Uso vb.net 2003


Luis Miguel Blanco

unread,
May 19, 2006, 2:16:02 AM5/19/06
to
Hola Jose

Prueba a utilizar un estilo para el datagrid acompañado de estilos de
columna para cada una de las columnas que quieras mostrar. Adicionalmente,
cada columna debería ser una clase heredada de DataGridTextBoxColumn, en la
que reemplazarías el evento Paint(), de forma que personalizaras el color a
pintar en cada celda cuando se de el caso de que la fila a mostrar sea una de
las que te interese destacar. Te adjunto a continuación un bloque de código
con un ejemplo para que lo pruebes, y en caso de que te sea válido, lo
adaptes a tu caso.

'/////////////////////////////////
Public Class Form1
Inherits System.Windows.Forms.Form

Private oConnection As SqlConnection
Private oDataAdapter As SqlDataAdapter
Private oDataSet As DataSet

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
oConnection = New
SqlConnection("Server=localhost;Database=Northwind;uid=sa;pwd=")
oDataAdapter = New SqlDataAdapter("SELECT
ProductID,ProductName,QuantityPerUnit FROM Products", oConnection)
oDataSet = New DataSet

oConnection.Open()
oDataAdapter.Fill(oDataSet, "Products")
oConnection.Close()

Dim oTableStyle As New DataGridTableStyle
oTableStyle.MappingName = "Products"

Me.DataGrid1.DataSource = oDataSet
Me.DataGrid1.DataMember = "Products"

Dim colProductID As New DGTxtColColor
colProductID.MappingName = "ProductID"
colProductID.HeaderText = "Código"
colProductID.ColorFondoCondicion = Color.Gold

Dim colProductName As New DGTxtColColor
colProductName.MappingName = "ProductName"
colProductName.HeaderText = "Nombre"
colProductName.ColorFondoCondicion = Color.Gold

Dim colCantidad As New DGTxtColColor
colCantidad.MappingName = "QuantityPerUnit"
colCantidad.HeaderText = "Cantidad"
colCantidad.ColorFondoCondicion = Color.Gold

oTableStyle.GridColumnStyles.AddRange(New DataGridColumnStyle() _
{colProductID, colProductName, colCantidad})

Me.DataGrid1.TableStyles.Add(oTableStyle)
End Sub
End Class

Public Class DGTxtColColor
Inherits DataGridTextBoxColumn

Private mColorFondoCondicion As Color

Public Property ColorFondoCondicion() As Color
Get
Return mColorFondoCondicion
End Get
Set(ByVal Value As Color)
mColorFondoCondicion = Value
End Set
End Property

Protected Overloads Overrides Sub Paint(ByVal g As
System.Drawing.Graphics, _
ByVal bounds As System.Drawing.Rectangle, _
ByVal source As System.Windows.Forms.CurrencyManager, _
ByVal rowNum As Integer, _
ByVal backBrush As System.Drawing.Brush, _
ByVal foreBrush As System.Drawing.Brush, _
ByVal alignToRight As Boolean)

Dim oBrush As SolidBrush

Select Case rowNum
Case 1, 3, 7, 8
oBrush = New SolidBrush(mColorFondoCondicion)
Case Else
oBrush = backBrush
End Select

MyBase.Paint(g, bounds, source, rowNum, _
oBrush, _
foreBrush, _
alignToRight)
End Sub
End Class
'/////////////////////////////////

Espero que te sea de utilidad.
--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

sagma

unread,
May 19, 2006, 12:12:02 PM5/19/06
to

una consulta, como haria para que el dato este entre ACTIVO y PASIVO, y no asi como esta con numeros?

gracias


--
sagma

------------------------------------------------------------------------
Ver este tema: http://www.softwaremix.net/viewtopic-516825.html

Enviado desde http://www.softwaremix.net


Jesús M.I

unread,
May 20, 2006, 6:20:01 AM5/20/06
to
no entiendo, lo explicas?

"sagma" escribió:

sagma

unread,
May 20, 2006, 10:19:33 AM5/20/06
to
Claro, el ejemplo que muestra nuestro amigo Luis Miguel Blanco,
funciona pero solo posecionandose los colores a las filas 1,3,7,8, y mi
pregunta es para que lo haga a todas las filas que estan con el campo o
nombre ACTIVO y/o PASIVO.

Y por sierto, Gracias LMB, por tu ejemplo que ayudo, ya que hacia rato
que esta buscando este ejemplo.

gracias

sagma

unread,
May 23, 2006, 12:04:29 PM5/23/06
to

Hola que tal, saben pille esto un poco mas abajo, el mismo LMB, lo escribio, pero aun no me muestra nada, esto es lo que he puesto:

Public Class DGTxtColColor

Inherits DataGridTextBoxColumn

Private mColorFondoCondicion As Color

Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, _


ByVal bounds As System.Drawing.Rectangle, _
ByVal source As System.Windows.Forms.CurrencyManager, _
ByVal rowNum As Integer, _
ByVal backBrush As System.Drawing.Brush, _
ByVal foreBrush As System.Drawing.Brush, _
ByVal alignToRight As Boolean)

Dim oBrush As SolidBrush
Dim ofiladatos As DataRowView = source.List(rowNum)

If ofiladatos("rhcondes1") = "BAJA" Then
oBrush = New SolidBrush(Color.Cyan)
Else
oBrush = backBrush
End If
'Select Case rowNum


'Case 1, 3, 7, 8

'oBrush = New SolidBrush(Color.Aquamarine)
'oBrush = New SolidBrush(mColorFondoCondicion)


'Case Else
'oBrush = backBrush
'End Select

MyBase.Paint(g, bounds, source, rowNum, _
oBrush, _
foreBrush, _
alignToRight)
End Sub

End Class

no me da ningun error, pero no lo muestra como era el otro, cuando le ponia, lo que esta comentado.

Luis Miguel Blanco

unread,
May 24, 2006, 2:02:01 AM5/24/06
to
Hola sagma

No hay de qué, celebro que te sea de utilidad 8-)


--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

Luis Miguel Blanco

unread,
May 24, 2006, 2:22:01 AM5/24/06
to
Hola sagma

Acabo de revisar este código y a mí me funciona correctamente. Lo que
hacemos aquí es obtener el número de fila que el datagrid va a "pintar", a
continuación, utilizando dicho número de fila, extraemos la correspondiente
fila del dataset que tenemos conectado al grid, en forma de datarowview, y
por último usamos este datarowview para comprobar el valor de uno de sus
campos; en el caso de que se cumpla la condición, cambiamos el color de fondo
de la celda.

Puede ser que te falte algo en la creación de los objectos columna que luego
asignas al estilo del grid. Revisa esta parte y compárala con la del ejemplo
original, en la que también incluí dicha creación de las columnas, grid,
dataset, etc; quizá sea aquí donde está el problema.


--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

sagma

unread,
May 24, 2006, 11:12:12 AM5/24/06
to

Hola LMB, cuando pongo el = 3, me sale este error.

If ofiladatos("rhcondes1") = 3 Then


oBrush = New SolidBrush(Color.Cyan)
Else
oBrush = backBrush
End If

"Exepcion no controlada del tipo "System.InvalidCastException" en System.windows.forms.dll"

Informacion adicional: la conversion de la cadena "ACTIVO" al tipo double no es valida.

y si le pongo de esta forma: no me da ningun error, pero no me muestra la linea marcada:

If ofiladatos("rhcondes1") = "ACTIVO" Then


oBrush = New SolidBrush(Color.Cyan)
Else
oBrush = backBrush
End If

gracias

Luis Miguel Blanco

unread,
May 25, 2006, 2:36:01 AM5/25/06
to
Hola sagma

Parece un error un tanto extraño 8-¿?¿?

¿Me podrías indicar qué valor tiene realmente el campo rhcondes1 de tu base
de datos, o la estructura de la tabla?


--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

sagma

unread,
May 25, 2006, 12:31:10 PM5/25/06
to

Claro, LMB, esto tengo en el LOAD:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

ds = emp.consulta("SELECT suempcemp,suempnemp,suempruni,suempdemp,suemptelf,rhcondes1 " & _
"FROM suemp,rhcon " & _
"WHERE rhcongrup = 500 " & _
" AND rhconsubg = suempstat " & _
"ORDER BY suempcemp")
DataGrid1.DataSource = ds.Tables("suemp")

'Cargando los status para la hora
panelTime.BorderStyle = StatusBarPanelBorderStyle.Sunken
panelTime.AutoSize = StatusBarPanelAutoSize.Spring
panelTime.Alignment = HorizontalAlignment.Right

'Cargando los status para la fecha
panelDate.BorderStyle = StatusBarPanelBorderStyle.Raised
panelDate.ToolTipText = System.DateTime.Today.ToShortDateString
panelDate.Text = System.DateTime.Today.ToLongDateString
panelDate.AutoSize = StatusBarPanelAutoSize.Contents

'Llenando el statusbar
StatusBar1.ShowPanels = True 'para que muestre varios paneles
StatusBar1.Panels.Add(panelTime)
StatusBar1.Panels.Add(panelDate)
StatusBar1.Panels.Add(panelEmp)

'para que cambie la hora y la fecha
Timer1.Start()

Call ConfigurarGrilla()

End Sub

Sub ConfigurarGrilla()

Dim myEstiloGrid As DataGridTableStyle = New DataGridTableStyle
myEstiloGrid.MappingName = "suemp"

'Codigo del empleado
Dim myEstiloCol As New DataGridTextBoxColumn
myEstiloCol.MappingName = "suempcemp"
myEstiloCol.HeaderText = "Codigo"
'myEstiloCol.ColorFondoCondicion = Color.Cyan
myEstiloCol.Width = 40

'Descripcion o nombre del empleado
Dim myEstiloCol2 As New DataGridTextBoxColumn
myEstiloCol2.MappingName = "suempnemp"
myEstiloCol2.HeaderText = "Nombre"
'myEstiloCol2.Alignment = HorizontalAlignment.Center
'myEstiloCol2.ColorFondoCondicion = Color.Cyan
myEstiloCol2.Width = 225

'estado en que se encuentra el trabajador
Dim myEstiloCol6 As New DGTxtColColor
myEstiloCol6.MappingName = "rhcondes1"
myEstiloCol6.HeaderText = "Estado"
'myEstiloCol6.ColorFondoCondicion = Color.Cyan
myEstiloCol6.Width = 60

myEstiloGrid.GridColumnStyles.Add(myEstiloCol)
myEstiloGrid.GridColumnStyles.Add(myEstiloCol2)
myEstiloGrid.GridColumnStyles.Add(myEstiloCol6)

Me.DataGrid1.TableStyles.Add(myEstiloGrid)

' Set up the grid tooltips.
Me.hitRow = -1
Me.toolTip1 = New ToolTip
Me.toolTip1.InitialDelay = 300
AddHandler Me.DataGrid1.MouseMove, AddressOf dataGrid1_MouseMove

end sub

como veras, rhcondes1 es un char (digo char, por que estos tomando datos de una tabla de informix.

hago el JOIN entre suemp y rhcon, de donde la tabla suemp esta solo el codigo 1 y/o 2,ya que uno es ACTIVO y 2 es BAJA, y estos datos de ACTIVO y BAJA estan en la tabla rhcon, de donde rhcon es rhconcond SERIAL, rhcondesc CHAR(60)

Luis Miguel Blanco

unread,
May 26, 2006, 11:59:02 AM5/26/06
to
Hola sagma

Con esta información que me has dado, creo que tengo una posible pista sobre
el origen del problema.

Si he entendido bien, en el campo rhcondes1 debería haber la cadena "ACTIVO"
o "BAJA", pero también dices que este campo es de tipo CHAR(60), por lo que
es probable que cuando grabes una cadena en él, te rellene con espacios en
blanco desde el final de la cadena que añades, hasta completar la longitud de
60.

Si esto es así, cuando en el evento Paint() de la clase personalizada para
estilo de columna vas a comprobar el valor del campo, puede que el campo del
objeto DataRowView tenga la cadena "BAJA" más los espacios en blanco hasta
completar una cadena con longitud 60, por lo que la expresión:

'///////////////////
If ofiladatos("rhcondes1") = "BAJA" Then
'///////////////////

no se cumpliría.

Prueba a eliminar primero los espacios en blanco de forma parecida a la
siguiente:

'///////////////////
If CType(ofiladatos("rhcondes1"), String).Trim() = "BAJA" Then
'///////////////////

a ver si de esta manera ya consigues el comportamiento necesario.


--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

sagma

unread,
May 29, 2006, 10:26:48 AM5/29/06
to

muchas, pero muchas gracias, funco como lo queria.

vas ha disculpar las molestias, pero tengo una duda, esta haciendo que en el mismo datagrid, con otro valor me muestro otro color.
Osea como veras BAJA, lo tendre de un color, pero para que otra descripcion como EGRESADO, sea de otro color, como seria?

Luis Miguel Blanco

unread,
May 31, 2006, 1:44:02 AM5/31/06
to
Hola segma

Celebro que finalmente te funcionara 8-)

Para conseguir esta otra funcionalidad que me comentas supongo que podrías
utilizar una estructura Select Case de forma parecida a la siguiente:

'/////////////////////////////
Dim sValorCampo As String
sValorCampo = CType(ofiladatos("rhcondes1"), String).Trim()

Select Case sValorCampo
Case "BAJA"
oBrush = New SolidBrush(Color.Cyan)
Case "EGRESADO"
oBrush = New SolidBrush(Color.Yellow)
Case Else
oBrush = backBrush
End Select
'/////////////////////////////

Con alguna adaptación supongo que te puede servir.


--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

sagma

unread,
May 31, 2006, 11:34:06 AM5/31/06
to
Mil gracias, de nuevo, mi querido LMB.

funco a la Perfect

Gracias

Luis Miguel Blanco

unread,
Jun 1, 2006, 1:29:01 AM6/1/06
to
Hola sagma

Estupendo, me alegro mucho de que funcionara y de haber aportado algo de
ayuda 8-)

0 new messages