Gracias por la ayuda.
Uso vb.net 2003
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
gracias
--
sagma
------------------------------------------------------------------------
Ver este tema: http://www.softwaremix.net/viewtopic-516825.html
Enviado desde http://www.softwaremix.net
"sagma" escribió:
Y por sierto, Gracias LMB, por tu ejemplo que ayudo, ya que hacia rato
que esta buscando este ejemplo.
gracias
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.
No hay de qué, celebro que te sea de utilidad 8-)
--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com
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
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
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
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)
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
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?
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
funco a la Perfect
Gracias
Estupendo, me alegro mucho de que funcionara y de haber aportado algo de
ayuda 8-)