Columna Datagrid

26/04/2006 - 11:10 por rarmada | Informe spam
Hola, estoy trabajando con VB2005 express y B.D. Acces, tengo un datagrid
enlazado a una base de datos con una columna que inicialmente debe tener el
valor 0,00 la consulta que me genera esto es:
"SELECT codigo, Titulo, HonorariosPrevistos, 0.00 AS ProducidoM FROM
Proyectos
Como podeis observat tengo 4 columnas 3 extraidas de una Tabla y una creada
con el valor 0.00. El problema es que el datagrid me detecta esta colunan
como un campo numerico entero. Mi pregunta es si hay alguna forma de
indicarle al datagrid que esta columna es de otro tipo es decir que admita
decimales, ?es posible con valuetype?, ¿como se hace?, tambien quería saber
que evento del datagrid es el más indicado para controlar que los datos
introducidos en una celda son correctos.
Gracias de antemano

Preguntas similare

Leer las respuestas

#1 Luis Miguel Blanco
27/04/2006 - 19:06 | Informe spam
Hola rarmada

Por el modo en que has creado el campo calculado ProducidoM en tu consulta
sql, al pasar el dataset al datagridview, automáticamente la columna detecta
que su contenido es de valores decimales, prueba a visualizarlo desde el
depurador, por ejemplo así:

?me.DataGridView1.Columns(3).ValueType.ToString

y te devolverá:

"System.Decimal"

Por lo tanto, la cuestión radica en que debemos escribir código para el
datagridview que se encargue de validar el que los valores que asignamos a
las celdas sean de tipo decimal, y en caso contrario dar un aviso.

Entre todos los eventos disponibles en el control datagridview, para este
caso podemos usar CellValidating, que se produce cuando hemos terminado de
editar la celda y salimos de su foco. Es aquí donde añadiremos el código para
comprobar el valor y actuar en consecuencia.

Te adjunto un ejemplo de código, el evento load() para cargar el grid de
datos, y el evento CellValidating, para realizar esta comprobación.

'///////////////////////////////////////////
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim oConnection As SqlConnection
Dim oDataAdapter As SqlDataAdapter
Dim oDataSet As DataSet

oConnection = New
SqlConnection("Server=localhost;Database=Northwind;uid=sa;pwd=sa")
oDataAdapter = New SqlDataAdapter("select orderid,shipname,shipcountry,
0.00 as ProducidoM from Orders", _
oConnection)
oDataSet = New DataSet

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

Me.DataGridView1.DataSource = oDataSet
Me.DataGridView1.DataMember = "Orders"
End Sub

'
' cuando la celda pierde el foco se dispara el evento de validación
Private Sub DataGridView1_CellValidating(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles
DataGridView1.CellValidating
' comprobar si estamos editando la celda correcta
If Me.DataGridView1.Columns("ProducidoM").Index = e.ColumnIndex Then
' obtener el valor de la celda y comprobarlo
Dim sContenidoCelda As String = e.FormattedValue
Dim nValorCelda As Decimal

Try
' si el valor de la celda no es el adecuado
' o genera un error al convertirlo a decimal
' cancelamos este evento
If Not sContenidoCelda.Contains(",") Then
e.Cancel = True
MessageBox.Show("Valor incorrecto")
Return
End If

nValorCelda = CType(sContenidoCelda, Decimal)

Catch ex As InvalidCastException
e.Cancel = True
MessageBox.Show("Valor incorrecto")
End Try
End If
End Sub
'///////////////////////////////////////////

La base de datos que he utilizado ha sido sql server, pero en este caso eso
es indiferente, ya que es cuestión del datagridview.

Espero que te sirva de ayuda
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"rarmada" wrote:

Hola, estoy trabajando con VB2005 express y B.D. Acces, tengo un datagrid
enlazado a una base de datos con una columna que inicialmente debe tener el
valor 0,00 la consulta que me genera esto es:
"SELECT codigo, Titulo, HonorariosPrevistos, 0.00 AS ProducidoM FROM
Proyectos
Como podeis observat tengo 4 columnas 3 extraidas de una Tabla y una creada
con el valor 0.00. El problema es que el datagrid me detecta esta colunan
como un campo numerico entero. Mi pregunta es si hay alguna forma de
indicarle al datagrid que esta columna es de otro tipo es decir que admita
decimales, ?es posible con valuetype?, ¿como se hace?, tambien quería saber
que evento del datagrid es el más indicado para controlar que los datos
introducidos en una celda son correctos.
Gracias de antemano
Respuesta Responder a este mensaje
#2 rarmada
28/04/2006 - 11:08 | Informe spam
Muchas Gracias por tu respuesta y el código que es mágnifico para mis
propositos.

Un saludo
rarmada


"Luis Miguel Blanco" wrote:

Hola rarmada

Por el modo en que has creado el campo calculado ProducidoM en tu consulta
sql, al pasar el dataset al datagridview, automáticamente la columna detecta
que su contenido es de valores decimales, prueba a visualizarlo desde el
depurador, por ejemplo así:

?me.DataGridView1.Columns(3).ValueType.ToString

y te devolverá:

"System.Decimal"

Por lo tanto, la cuestión radica en que debemos escribir código para el
datagridview que se encargue de validar el que los valores que asignamos a
las celdas sean de tipo decimal, y en caso contrario dar un aviso.

Entre todos los eventos disponibles en el control datagridview, para este
caso podemos usar CellValidating, que se produce cuando hemos terminado de
editar la celda y salimos de su foco. Es aquí donde añadiremos el código para
comprobar el valor y actuar en consecuencia.

Te adjunto un ejemplo de código, el evento load() para cargar el grid de
datos, y el evento CellValidating, para realizar esta comprobación.

'///////////////////////////////////////////
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim oConnection As SqlConnection
Dim oDataAdapter As SqlDataAdapter
Dim oDataSet As DataSet

oConnection = New
SqlConnection("Server=localhost;Database=Northwind;uid=sa;pwd=sa")
oDataAdapter = New SqlDataAdapter("select orderid,shipname,shipcountry,
0.00 as ProducidoM from Orders", _
oConnection)
oDataSet = New DataSet

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

Me.DataGridView1.DataSource = oDataSet
Me.DataGridView1.DataMember = "Orders"
End Sub

'
' cuando la celda pierde el foco se dispara el evento de validación
Private Sub DataGridView1_CellValidating(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles
DataGridView1.CellValidating
' comprobar si estamos editando la celda correcta
If Me.DataGridView1.Columns("ProducidoM").Index = e.ColumnIndex Then
' obtener el valor de la celda y comprobarlo
Dim sContenidoCelda As String = e.FormattedValue
Dim nValorCelda As Decimal

Try
' si el valor de la celda no es el adecuado
' o genera un error al convertirlo a decimal
' cancelamos este evento
If Not sContenidoCelda.Contains(",") Then
e.Cancel = True
MessageBox.Show("Valor incorrecto")
Return
End If

nValorCelda = CType(sContenidoCelda, Decimal)

Catch ex As InvalidCastException
e.Cancel = True
MessageBox.Show("Valor incorrecto")
End Try
End If
End Sub
'///////////////////////////////////////////

La base de datos que he utilizado ha sido sql server, pero en este caso eso
es indiferente, ya que es cuestión del datagridview.

Espero que te sirva de ayuda
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"rarmada" wrote:

> Hola, estoy trabajando con VB2005 express y B.D. Acces, tengo un datagrid
> enlazado a una base de datos con una columna que inicialmente debe tener el
> valor 0,00 la consulta que me genera esto es:
> "SELECT codigo, Titulo, HonorariosPrevistos, 0.00 AS ProducidoM FROM
> Proyectos
> Como podeis observat tengo 4 columnas 3 extraidas de una Tabla y una creada
> con el valor 0.00. El problema es que el datagrid me detecta esta colunan
> como un campo numerico entero. Mi pregunta es si hay alguna forma de
> indicarle al datagrid que esta columna es de otro tipo es decir que admita
> decimales, ?es posible con valuetype?, ¿como se hace?, tambien quería saber
> que evento del datagrid es el más indicado para controlar que los datos
> introducidos en una celda son correctos.
> Gracias de antemano
Respuesta Responder a este mensaje
#3 Luis Miguel Blanco
28/04/2006 - 11:42 | Informe spam
No hay de qué, ha sido un placer. Celebro que te haya servido mi ayuda 8-)
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"rarmada" wrote:


Muchas Gracias por tu respuesta y el código que es mágnifico para mis
propositos.

Un saludo
rarmada


"Luis Miguel Blanco" wrote:

> Hola rarmada
>
> Por el modo en que has creado el campo calculado ProducidoM en tu consulta
> sql, al pasar el dataset al datagridview, automáticamente la columna detecta
> que su contenido es de valores decimales, prueba a visualizarlo desde el
> depurador, por ejemplo así:
>
> ?me.DataGridView1.Columns(3).ValueType.ToString
>
> y te devolverá:
>
> "System.Decimal"
>
> Por lo tanto, la cuestión radica en que debemos escribir código para el
> datagridview que se encargue de validar el que los valores que asignamos a
> las celdas sean de tipo decimal, y en caso contrario dar un aviso.
>
> Entre todos los eventos disponibles en el control datagridview, para este
> caso podemos usar CellValidating, que se produce cuando hemos terminado de
> editar la celda y salimos de su foco. Es aquí donde añadiremos el código para
> comprobar el valor y actuar en consecuencia.
>
> Te adjunto un ejemplo de código, el evento load() para cargar el grid de
> datos, y el evento CellValidating, para realizar esta comprobación.
>
> '///////////////////////////////////////////
> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles MyBase.Load
> Dim oConnection As SqlConnection
> Dim oDataAdapter As SqlDataAdapter
> Dim oDataSet As DataSet
>
> oConnection = New
> SqlConnection("Server=localhost;Database=Northwind;uid=sa;pwd=sa")
> oDataAdapter = New SqlDataAdapter("select orderid,shipname,shipcountry,
> 0.00 as ProducidoM from Orders", _
> oConnection)
> oDataSet = New DataSet
>
> oConnection.Open()
> oDataAdapter.Fill(oDataSet, "Orders")
> oConnection.Close()
>
> Me.DataGridView1.DataSource = oDataSet
> Me.DataGridView1.DataMember = "Orders"
> End Sub
>
> '
> ' cuando la celda pierde el foco se dispara el evento de validación
> Private Sub DataGridView1_CellValidating(ByVal sender As Object, ByVal e As
> System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles
> DataGridView1.CellValidating
> ' comprobar si estamos editando la celda correcta
> If Me.DataGridView1.Columns("ProducidoM").Index = e.ColumnIndex Then
> ' obtener el valor de la celda y comprobarlo
> Dim sContenidoCelda As String = e.FormattedValue
> Dim nValorCelda As Decimal
>
> Try
> ' si el valor de la celda no es el adecuado
> ' o genera un error al convertirlo a decimal
> ' cancelamos este evento
> If Not sContenidoCelda.Contains(",") Then
> e.Cancel = True
> MessageBox.Show("Valor incorrecto")
> Return
> End If
>
> nValorCelda = CType(sContenidoCelda, Decimal)
>
> Catch ex As InvalidCastException
> e.Cancel = True
> MessageBox.Show("Valor incorrecto")
> End Try
> End If
> End Sub
> '///////////////////////////////////////////
>
> La base de datos que he utilizado ha sido sql server, pero en este caso eso
> es indiferente, ya que es cuestión del datagridview.
>
> Espero que te sirva de ayuda
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "rarmada" wrote:
>
> > Hola, estoy trabajando con VB2005 express y B.D. Acces, tengo un datagrid
> > enlazado a una base de datos con una columna que inicialmente debe tener el
> > valor 0,00 la consulta que me genera esto es:
> > "SELECT codigo, Titulo, HonorariosPrevistos, 0.00 AS ProducidoM FROM
> > Proyectos
> > Como podeis observat tengo 4 columnas 3 extraidas de una Tabla y una creada
> > con el valor 0.00. El problema es que el datagrid me detecta esta colunan
> > como un campo numerico entero. Mi pregunta es si hay alguna forma de
> > indicarle al datagrid que esta columna es de otro tipo es decir que admita
> > decimales, ?es posible con valuetype?, ¿como se hace?, tambien quería saber
> > que evento del datagrid es el más indicado para controlar que los datos
> > introducidos en una celda son correctos.
> > Gracias de antemano
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida