(demasiado antiguo para responder)
Bloquear columnas en VSFlexgrid
gemma
2007-02-01 17:45:59 UTC
Hola querido foro:
Precisaria fijar o bloquear unas columnas alternativas, es decir, la 1 y la
3 de un total de 5 por ejemplo, en un control VSFlexgrid que lo tengo
editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.
ferg
2007-02-02 12:42:21 UTC
GEMMA, para "bloquear"/"fijar" una columna en el control VsFlexGrid, solo
puedes establecer la propiedad FixedCols a un valor distinto de 0, en cuyo
caso, se fijará (quedarán como la fila 0 de titulos) la cantidad establecida
de columnas que se encuentran más a la izquierda. Por ejemplo: Para
.FixedCols=2 >> quedarán fijas las columnas 0,1,2. No pudiendo especificar
que determinada columna "del medio" (por ejemplo la columna 4) quede fija.

Si en cambio, lo que deseas es evitar que cuando el control tiene la
propiedad .Editable = flexEDKbd; te editen determinadas columnas y otras
no... lo que puedes hacer es lo siguiente...
En el evento "BeforeEdit" (antes de editar) validas que la columna que te
estan editando no sea alguna de las que tu no permites, en cuyo caso si es
una de las que tu quieres evitar que se editen, cancelas la edición con
Cancel = True

Ejemplo....
Private Sub grilla_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel
As Boolean)
With grilla
If (Col <> .ColIndex("CANTIDAD")) And (Col <> .ColIndex("P_UNIT"))
Then 'enumeras las columnas que se pueden editar, o si son menos las que no
se editan, establece condiciones de igualdad.
Cancel = True
End If
End With
End Sub


Saludos.
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Precisaria fijar o bloquear unas columnas alternativas, es decir, la 1 y
la 3 de un total de 5 por ejemplo, en un control VSFlexgrid que lo tengo
editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.
gemma
2007-02-02 13:48:00 UTC
Hola Fernando:
Muchísimas gracias por tu respuesta tan bien aclarada y desarrollada. Me he
vuelto tonta, intentandolo todo, he mirado la Ayuda, los ejemplos y no he
encontrado nada. Ahora lo veo claro, voy a cambiar el sistema de como lo
tengo, por el que tu me has indicado.
Te quedo enormemente agradecida.
Recibe un fuerte abrazo.
Gemma.
Post by ferg
GEMMA, para "bloquear"/"fijar" una columna en el control VsFlexGrid, solo
puedes establecer la propiedad FixedCols a un valor distinto de 0, en cuyo
caso, se fijará (quedarán como la fila 0 de titulos) la cantidad
Para .FixedCols=2 >> quedarán fijas las columnas 0,1,2. No pudiendo
especificar que determinada columna "del medio" (por ejemplo la columna 4)
quede fija.
Si en cambio, lo que deseas es evitar que cuando el control tiene la
propiedad .Editable = flexEDKbd; te editen determinadas columnas y otras
no... lo que puedes hacer es lo siguiente...
En el evento "BeforeEdit" (antes de editar) validas que la columna que te
estan editando no sea alguna de las que tu no permites, en cuyo caso si es
una de las que tu quieres evitar que se editen, cancelas la edición con
Cancel = True
Ejemplo....
Private Sub grilla_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel
As Boolean)
With grilla
If (Col <> .ColIndex("CANTIDAD")) And (Col <> .ColIndex("P_UNIT"))
Then 'enumeras las columnas que se pueden editar, o si son menos las que
no se editan, establece condiciones de igualdad.
Cancel = True
End If
End With
End Sub
Saludos.
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Precisaria fijar o bloquear unas columnas alternativas, es decir, la 1 y
la 3 de un total de 5 por ejemplo, en un control VSFlexgrid que lo tengo
editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.
ferg
2007-02-02 13:51:26 UTC
Me alegro que te servido!...

Otro abrazo.
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Muchísimas gracias por tu respuesta tan bien aclarada y desarrollada. Me
he vuelto tonta, intentandolo todo, he mirado la Ayuda, los ejemplos y no
he encontrado nada. Ahora lo veo claro, voy a cambiar el sistema de como
lo tengo, por el que tu me has indicado.
Te quedo enormemente agradecida.
Recibe un fuerte abrazo.
Gemma.
Post by ferg
GEMMA, para "bloquear"/"fijar" una columna en el control VsFlexGrid, solo
puedes establecer la propiedad FixedCols a un valor distinto de 0, en
cuyo caso, se fijará (quedarán como la fila 0 de titulos) la cantidad
establecida de columnas que se encuentran más a la izquierda. Por
ejemplo: Para .FixedCols=2 >> quedarán fijas las columnas 0,1,2. No
pudiendo especificar que determinada columna "del medio" (por ejemplo la
columna 4) quede fija.
Si en cambio, lo que deseas es evitar que cuando el control tiene la
propiedad .Editable = flexEDKbd; te editen determinadas columnas y otras
no... lo que puedes hacer es lo siguiente...
En el evento "BeforeEdit" (antes de editar) validas que la columna que te
estan editando no sea alguna de las que tu no permites, en cuyo caso si
es una de las que tu quieres evitar que se editen, cancelas la edición
con Cancel = True
Ejemplo....
Private Sub grilla_BeforeEdit(ByVal Row As Long, ByVal Col As Long,
Cancel As Boolean)
With grilla
If (Col <> .ColIndex("CANTIDAD")) And (Col <> .ColIndex("P_UNIT"))
Then 'enumeras las columnas que se pueden editar, o si son menos las que
no se editan, establece condiciones de igualdad.
Cancel = True
End If
End With
End Sub
Saludos.
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Precisaria fijar o bloquear unas columnas alternativas, es decir, la 1 y
la 3 de un total de 5 por ejemplo, en un control VSFlexgrid que lo tengo
editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.
gemma
2007-02-02 15:57:50 UTC
Hola Fernando:
Bueno he estado probando y me bloquea todas las columnas, no dejándome
editar las dos que necesito. Te comento con mas detalle. como lo tengo.
El VbFlexgrid. tiene su propiedad editable=1 - flexEDKbd.
Después el flex tiene 9 columnas: 0 a 8, en las cuales necesitamos editar la
5 y la 6. Por propiedades tengo fijas la columna 0 y la row 0y 1. y el
título de las dos columnas es "AJUSTES" y "AJUSTES", ya que debajo llevan
el DEBE (Columna5) y HABER (Columna6), el título AJUSTE está realizado con
.MergeCells = flexMergeFree
Y el código que pongo según he entendido de tu ejemplo, es el siguiente:
Private Sub Flex1_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel As
Boolean)
With Flex1
'Enumeramos las columnas que se pueden editar, o si son menos las
que no se editan, establece condiciones de igualdad
'//// If (Col <> .ColIndex(5)) And (Col <> .ColIndex(6)) Then
If (Col <> .ColIndex("AJUSTES")) And (Col <> .ColIndex("AJUSTES"))
Then
Cancel = False
End If
End With
End Sub

Pues estando así no me lo coge, por lo que creo que hago algo mal hecho, lo
he probado como verás también con index(5) y index(6), pero tampoco, no dá
ningún error, pero quedan todas las columnas bloqueadas, sin permitir la
edición en ninguna de ellas.
Fernando, no tengo experiencia en estas sentencias por lo que te rogaría si
puedes, le eches un vistazo a ver donde puede estar el error.
Te agradezco enormemente tu valiosa ayuda.
Un abrazo.
Gemma.
Post by ferg
Me alegro que te servido!...
Otro abrazo.
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Muchísimas gracias por tu respuesta tan bien aclarada y desarrollada. Me
he vuelto tonta, intentandolo todo, he mirado la Ayuda, los ejemplos y no
he encontrado nada. Ahora lo veo claro, voy a cambiar el sistema de como
lo tengo, por el que tu me has indicado.
Te quedo enormemente agradecida.
Recibe un fuerte abrazo.
Gemma.
Post by ferg
GEMMA, para "bloquear"/"fijar" una columna en el control VsFlexGrid,
solo puedes establecer la propiedad FixedCols a un valor distinto de 0,
en cuyo caso, se fijará (quedarán como la fila 0 de titulos) la cantidad
establecida de columnas que se encuentran más a la izquierda. Por
ejemplo: Para .FixedCols=2 >> quedarán fijas las columnas 0,1,2. No
pudiendo especificar que determinada columna "del medio" (por ejemplo la
columna 4) quede fija.
Si en cambio, lo que deseas es evitar que cuando el control tiene la
propiedad .Editable = flexEDKbd; te editen determinadas columnas y otras
no... lo que puedes hacer es lo siguiente...
En el evento "BeforeEdit" (antes de editar) validas que la columna que
te estan editando no sea alguna de las que tu no permites, en cuyo caso
si es una de las que tu quieres evitar que se editen, cancelas la
edición con Cancel = True
Ejemplo....
Private Sub grilla_BeforeEdit(ByVal Row As Long, ByVal Col As Long,
Cancel As Boolean)
With grilla
If (Col <> .ColIndex("CANTIDAD")) And (Col <>
.ColIndex("P_UNIT")) Then 'enumeras las columnas que se pueden editar, o
si son menos las que no se editan, establece condiciones de igualdad.
Cancel = True
End If
End With
End Sub
Saludos.
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Precisaria fijar o bloquear unas columnas alternativas, es decir, la 1
y la 3 de un total de 5 por ejemplo, en un control VSFlexgrid que lo
tengo editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.
ferg
2007-02-02 18:55:34 UTC
gemma; el ejemplo que te di yo, era para que uses los nombres que le das a
las columnas (a traves de la propiedad ".ColKey")... para tu caso, deberías
hacerlo de la siguiente manera...

Private Sub Flex1_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel As
Boolean)
With Flex1
'Enumeramos las columnas que se pueden editar, o si son menos las
que no se editan, establece condiciones de igualdad
If (Col <> 5) And (Col <> 6) Then 'asi de simple... ya que "col" te
devuelve el nro de columna que está siendo editada.
Cancel = False
End If
End With
End Sub

####
Si no te molesta te paso una rutina que yo utilizo para iniziar las
propiedades de la grilla...

Private Sub IniciarGrilla()
With Grilla
'**************************************************************************************
'Propiedades generales de la grilla.
.AllowUserResizing = flexResizeColumns
.Rows = 1
.FixedRows = 1
.FixedCols = 0
.cols = 0
.Editable = flexEDNone
.AutoSearch = flexSearchFromTop
.ExplorerBar = flexExSortShowAndMove

'**************************************************************************************
'agrego una columna. En este caso el NOMBRE DEL PRODUCTO. Se repite
esta sección para cada columna
'que desees incluir en la grilla. No son necesarias todas las
propiedades, yo te las incluyo para que utilices las que
'necesitas en cada caso.
.Cols = .Cols + 1
.TextMatrix(0, .Cols - 1) = "NOMBRE" & VBCRLF & "PRODUCTO" 'este es
el texto que te aperecera en el
'TITULO de la COLUMNA.
.RowHeight(0) = 500
.ColKey(.Cols - 1) = "NOMBRE_PDCTO" 'Este es el nombre que le damos
a la columna para luego
'poder referenciarla sin importar la posicion que ocupe entre
las demás columnas (sobre todo si permites que el
'usuario las cambie de lugar), con la propiedad
.ColIndex("NOMBRE_PDCTO")) . Esta propiedad, devuelve el nro
'de columna a partir del nombre que le asignamos a la columna.
.ColHidden(.Cols - 1) = True/false 'si queremos oculatar/mostrar la
columna.
.ColDataType(.Cols - 1) = flexDTString/flexDTDouble 'el tipo de
dato, no siempre lo uso...
.ColFormat(.Cols - 1) = "#,###.0000" 'en caso de que sea tipo
numerico, a veces le defino el formato para mostrar.
.FixedAlignment(.Cols - 1) = flexAlignCenterCenter ' alineacion del
titulo de la columna.
.ColAlignment(.Cols - 1) = flexAlignRightCenter 'alineacion del
contenido de las celdas que pertenecen a la columna.
'**************************************************************************************
'al final de la iniciación de la grilla, hago lo siguiente, para que
las columnas se auto ajusten al ancho de los textos...
'también lo hago cuando lleno la grilla para que esta se adapte al
contenido...(solo si tu quieres que se lea todo el texto
'de las celdas)
.AutoSizeMode = flexAutoSizeColWidth
.AutoSize 0, .Cols - 1
End With
'********************************************************************************
End Sub

LISTO; Esa rutina la llamo en el Form_load() del formulario que tiene la
grilla para inicializarla..

NOTA: ten en cuenta que esta rutina siempre la debes incluir en el form que
tenga la grilla a iniciar; dado a que hay que definirle a mano todas las
propiedades específicas para la grilla en cuestión (por lo tanto salvo casos
especiales, dudo que la puedas poner en un módulo general para reusar, ya
que los nombres y propiedades varian de grilla en grilla .... a lo mejor se
podría hacer un grupo de clases con las propiedades a setear para cada
columna, pero creo que no tendría sentido ya que se repetiría lo mismo...).
De todas formas, yo copio siempre la estructura esta que te paso, y la edito
para cada caso particular.

Espero no haberte complicado demasiado y que te sea de utilidad...
Saludos
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Bueno he estado probando y me bloquea todas las columnas, no dejándome
editar las dos que necesito. Te comento con mas detalle. como lo tengo.
El VbFlexgrid. tiene su propiedad editable=1 - flexEDKbd.
Después el flex tiene 9 columnas: 0 a 8, en las cuales necesitamos editar
la 5 y la 6. Por propiedades tengo fijas la columna 0 y la row 0y 1. y el
título de las dos columnas es "AJUSTES" y "AJUSTES", ya que debajo llevan
el DEBE (Columna5) y HABER (Columna6), el título AJUSTE está realizado con
.MergeCells = flexMergeFree
Private Sub Flex1_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel
As Boolean)
With Flex1
'Enumeramos las columnas que se pueden editar, o si son menos las
que no se editan, establece condiciones de igualdad
'//// If (Col <> .ColIndex(5)) And (Col <> .ColIndex(6)) Then
If (Col <> .ColIndex("AJUSTES")) And (Col <> .ColIndex("AJUSTES"))
Then
Cancel = False
End If
End With
End Sub
Pues estando así no me lo coge, por lo que creo que hago algo mal hecho,
lo he probado como verás también con index(5) y index(6), pero tampoco, no
dá ningún error, pero quedan todas las columnas bloqueadas, sin permitir
la edición en ninguna de ellas.
Fernando, no tengo experiencia en estas sentencias por lo que te rogaría
si puedes, le eches un vistazo a ver donde puede estar el error.
Te agradezco enormemente tu valiosa ayuda.
Un abrazo.
Gemma.
Post by ferg
Me alegro que te servido!...
Otro abrazo.
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Muchísimas gracias por tu respuesta tan bien aclarada y desarrollada. Me
he vuelto tonta, intentandolo todo, he mirado la Ayuda, los ejemplos y
no he encontrado nada. Ahora lo veo claro, voy a cambiar el sistema de
como lo tengo, por el que tu me has indicado.
Te quedo enormemente agradecida.
Recibe un fuerte abrazo.
Gemma.
Post by ferg
GEMMA, para "bloquear"/"fijar" una columna en el control VsFlexGrid,
solo puedes establecer la propiedad FixedCols a un valor distinto de 0,
en cuyo caso, se fijará (quedarán como la fila 0 de titulos) la
cantidad establecida de columnas que se encuentran más a la izquierda.
Por ejemplo: Para .FixedCols=2 >> quedarán fijas las columnas 0,1,2. No
pudiendo especificar que determinada columna "del medio" (por ejemplo
la columna 4) quede fija.
Si en cambio, lo que deseas es evitar que cuando el control tiene la
propiedad .Editable = flexEDKbd; te editen determinadas columnas y
otras no... lo que puedes hacer es lo siguiente...
En el evento "BeforeEdit" (antes de editar) validas que la columna que
te estan editando no sea alguna de las que tu no permites, en cuyo caso
si es una de las que tu quieres evitar que se editen, cancelas la
edición con Cancel = True
Ejemplo....
Private Sub grilla_BeforeEdit(ByVal Row As Long, ByVal Col As Long,
Cancel As Boolean)
With grilla
If (Col <> .ColIndex("CANTIDAD")) And (Col <>
.ColIndex("P_UNIT")) Then 'enumeras las columnas que se pueden editar,
o si son menos las que no se editan, establece condiciones de igualdad.
Cancel = True
End If
End With
End Sub
Saludos.
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Precisaria fijar o bloquear unas columnas alternativas, es decir, la 1
y la 3 de un total de 5 por ejemplo, en un control VSFlexgrid que lo
tengo editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.
gemma
2007-02-02 19:43:23 UTC
Hola Fernando.
A veces me obceco en las cosas y no las veo. Efectivamente ahora funciona de
maravilla. Te agradezco de todo corazón tu ayuda y la extensión que has
hecho de ella, porque siempre aprendemos de los que más saben. (ese es mi
caso.)
Reitero las gracias de todo corazón por tu ayuda.
Un abrazo muy grande.
Gemma.
Post by ferg
gemma; el ejemplo que te di yo, era para que uses los nombres que le das a
las columnas (a traves de la propiedad ".ColKey")... para tu caso,
deberías hacerlo de la siguiente manera...
Private Sub Flex1_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel
As Boolean)
With Flex1
'Enumeramos las columnas que se pueden editar, o si son menos las
que no se editan, establece condiciones de igualdad
If (Col <> 5) And (Col <> 6) Then 'asi de simple... ya que "col" te
devuelve el nro de columna que está siendo editada.
Cancel = False
End If
End With
End Sub
####
Si no te molesta te paso una rutina que yo utilizo para iniziar las
propiedades de la grilla...
Private Sub IniciarGrilla()
With Grilla
'**************************************************************************************
'Propiedades generales de la grilla.
.AllowUserResizing = flexResizeColumns
.Rows = 1
.FixedRows = 1
.FixedCols = 0
.cols = 0
.Editable = flexEDNone
.AutoSearch = flexSearchFromTop
.ExplorerBar = flexExSortShowAndMove
'**************************************************************************************
'agrego una columna. En este caso el NOMBRE DEL PRODUCTO. Se repite
esta sección para cada columna
'que desees incluir en la grilla. No son necesarias todas las
propiedades, yo te las incluyo para que utilices las que
'necesitas en cada caso.
.Cols = .Cols + 1
.TextMatrix(0, .Cols - 1) = "NOMBRE" & VBCRLF & "PRODUCTO" 'este es
el texto que te aperecera en el
'TITULO de la COLUMNA.
.RowHeight(0) = 500
.ColKey(.Cols - 1) = "NOMBRE_PDCTO" 'Este es el nombre que le
damos a la columna para luego
'poder referenciarla sin importar la posicion que ocupe entre
las demás columnas (sobre todo si permites que el
'usuario las cambie de lugar), con la propiedad
.ColIndex("NOMBRE_PDCTO")) . Esta propiedad, devuelve el nro
'de columna a partir del nombre que le asignamos a la columna.
.ColHidden(.Cols - 1) = True/false 'si queremos oculatar/mostrar la
columna.
.ColDataType(.Cols - 1) = flexDTString/flexDTDouble 'el tipo de
dato, no siempre lo uso...
.ColFormat(.Cols - 1) = "#,###.0000" 'en caso de que sea tipo
numerico, a veces le defino el formato para mostrar.
.FixedAlignment(.Cols - 1) = flexAlignCenterCenter ' alineacion del
titulo de la columna.
.ColAlignment(.Cols - 1) = flexAlignRightCenter 'alineacion del
contenido de las celdas que pertenecen a la columna.
'**************************************************************************************
'al final de la iniciación de la grilla, hago lo siguiente, para
que las columnas se auto ajusten al ancho de los textos...
'también lo hago cuando lleno la grilla para que esta se adapte al
contenido...(solo si tu quieres que se lea todo el texto
'de las celdas)
.AutoSizeMode = flexAutoSizeColWidth
.AutoSize 0, .Cols - 1
End With
'********************************************************************************
End Sub
LISTO; Esa rutina la llamo en el Form_load() del formulario que tiene la
grilla para inicializarla..
NOTA: ten en cuenta que esta rutina siempre la debes incluir en el form
que tenga la grilla a iniciar; dado a que hay que definirle a mano todas
las propiedades específicas para la grilla en cuestión (por lo tanto salvo
casos especiales, dudo que la puedas poner en un módulo general para
reusar, ya que los nombres y propiedades varian de grilla en grilla .... a
lo mejor se podría hacer un grupo de clases con las propiedades a setear
para cada columna, pero creo que no tendría sentido ya que se repetiría lo
mismo...). De todas formas, yo copio siempre la estructura esta que te
paso, y la edito para cada caso particular.
Espero no haberte complicado demasiado y que te sea de utilidad...
Saludos
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Bueno he estado probando y me bloquea todas las columnas, no dejándome
editar las dos que necesito. Te comento con mas detalle. como lo tengo.
El VbFlexgrid. tiene su propiedad editable=1 - flexEDKbd.
Después el flex tiene 9 columnas: 0 a 8, en las cuales necesitamos editar
la 5 y la 6. Por propiedades tengo fijas la columna 0 y la row 0y 1. y el
título de las dos columnas es "AJUSTES" y "AJUSTES", ya que debajo
llevan el DEBE (Columna5) y HABER (Columna6), el título AJUSTE está
realizado con .MergeCells = flexMergeFree
Private Sub Flex1_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel
As Boolean)
With Flex1
'Enumeramos las columnas que se pueden editar, o si son menos las
que no se editan, establece condiciones de igualdad
'//// If (Col <> .ColIndex(5)) And (Col <> .ColIndex(6)) Then
If (Col <> .ColIndex("AJUSTES")) And (Col <> .ColIndex("AJUSTES"))
Then
Cancel = False
End If
End With
End Sub
Pues estando así no me lo coge, por lo que creo que hago algo mal hecho,
lo he probado como verás también con index(5) y index(6), pero tampoco,
no dá ningún error, pero quedan todas las columnas bloqueadas, sin
permitir la edición en ninguna de ellas.
Fernando, no tengo experiencia en estas sentencias por lo que te rogaría
si puedes, le eches un vistazo a ver donde puede estar el error.
Te agradezco enormemente tu valiosa ayuda.
Un abrazo.
Gemma.
Post by ferg
Me alegro que te servido!...
Otro abrazo.
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Muchísimas gracias por tu respuesta tan bien aclarada y desarrollada.
Me he vuelto tonta, intentandolo todo, he mirado la Ayuda, los ejemplos
y no he encontrado nada. Ahora lo veo claro, voy a cambiar el sistema
de como lo tengo, por el que tu me has indicado.
Te quedo enormemente agradecida.
Recibe un fuerte abrazo.
Gemma.
Post by ferg
GEMMA, para "bloquear"/"fijar" una columna en el control VsFlexGrid,
solo puedes establecer la propiedad FixedCols a un valor distinto de
0, en cuyo caso, se fijará (quedarán como la fila 0 de titulos) la
cantidad establecida de columnas que se encuentran más a la izquierda.
Por ejemplo: Para .FixedCols=2 >> quedarán fijas las columnas 0,1,2.
No pudiendo especificar que determinada columna "del medio" (por
ejemplo la columna 4) quede fija.
Si en cambio, lo que deseas es evitar que cuando el control tiene la
propiedad .Editable = flexEDKbd; te editen determinadas columnas y
otras no... lo que puedes hacer es lo siguiente...
En el evento "BeforeEdit" (antes de editar) validas que la columna que
te estan editando no sea alguna de las que tu no permites, en cuyo
caso si es una de las que tu quieres evitar que se editen, cancelas la
edición con Cancel = True
Ejemplo....
Private Sub grilla_BeforeEdit(ByVal Row As Long, ByVal Col As Long,
Cancel As Boolean)
With grilla
If (Col <> .ColIndex("CANTIDAD")) And (Col <>
.ColIndex("P_UNIT")) Then 'enumeras las columnas que se pueden editar,
o si son menos las que no se editan, establece condiciones de igualdad.
Cancel = True
End If
End With
End Sub
Saludos.
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Precisaria fijar o bloquear unas columnas alternativas, es decir, la
1 y la 3 de un total de 5 por ejemplo, en un control VSFlexgrid que
lo tengo editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.
ferg
2007-02-02 19:47:32 UTC
No hay de que...

Saludos.
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Hola Fernando.
A veces me obceco en las cosas y no las veo. Efectivamente ahora funciona
de maravilla. Te agradezco de todo corazón tu ayuda y la extensión que has
hecho de ella, porque siempre aprendemos de los que más saben. (ese es mi
caso.)
Reitero las gracias de todo corazón por tu ayuda.
Un abrazo muy grande.
Gemma.
Post by ferg
gemma; el ejemplo que te di yo, era para que uses los nombres que le das
a las columnas (a traves de la propiedad ".ColKey")... para tu caso,
deberías hacerlo de la siguiente manera...
Private Sub Flex1_BeforeEdit(ByVal Row As Long, ByVal Col As Long, Cancel
As Boolean)
With Flex1
'Enumeramos las columnas que se pueden editar, o si son menos las
que no se editan, establece condiciones de igualdad
If (Col <> 5) And (Col <> 6) Then 'asi de simple... ya que "col"
te devuelve el nro de columna que está siendo editada.
Cancel = False
End If
End With
End Sub
####
Si no te molesta te paso una rutina que yo utilizo para iniziar las
propiedades de la grilla...
Private Sub IniciarGrilla()
With Grilla
'**************************************************************************************
'Propiedades generales de la grilla.
.AllowUserResizing = flexResizeColumns
.Rows = 1
.FixedRows = 1
.FixedCols = 0
.cols = 0
.Editable = flexEDNone
.AutoSearch = flexSearchFromTop
.ExplorerBar = flexExSortShowAndMove
'**************************************************************************************
'agrego una columna. En este caso el NOMBRE DEL PRODUCTO. Se
repite esta sección para cada columna
'que desees incluir en la grilla. No son necesarias todas las
propiedades, yo te las incluyo para que utilices las que
'necesitas en cada caso.
.Cols = .Cols + 1
.TextMatrix(0, .Cols - 1) = "NOMBRE" & VBCRLF & "PRODUCTO" 'este
es el texto que te aperecera en el
'TITULO de la COLUMNA.
.RowHeight(0) = 500
.ColKey(.Cols - 1) = "NOMBRE_PDCTO" 'Este es el nombre que le
damos a la columna para luego
'poder referenciarla sin importar la posicion que ocupe entre
las demás columnas (sobre todo si permites que el
'usuario las cambie de lugar), con la propiedad
.ColIndex("NOMBRE_PDCTO")) . Esta propiedad, devuelve el nro
'de columna a partir del nombre que le asignamos a la columna.
.ColHidden(.Cols - 1) = True/false 'si queremos oculatar/mostrar
la columna.
.ColDataType(.Cols - 1) = flexDTString/flexDTDouble 'el tipo de
dato, no siempre lo uso...
.ColFormat(.Cols - 1) = "#,###.0000" 'en caso de que sea tipo
numerico, a veces le defino el formato para mostrar.
.FixedAlignment(.Cols - 1) = flexAlignCenterCenter ' alineacion
del titulo de la columna.
.ColAlignment(.Cols - 1) = flexAlignRightCenter 'alineacion del
contenido de las celdas que pertenecen a la columna.
'**************************************************************************************
'al final de la iniciación de la grilla, hago lo siguiente, para
que las columnas se auto ajusten al ancho de los textos...
'también lo hago cuando lleno la grilla para que esta se adapte al
contenido...(solo si tu quieres que se lea todo el texto
'de las celdas)
.AutoSizeMode = flexAutoSizeColWidth
.AutoSize 0, .Cols - 1
End With
'********************************************************************************
End Sub
LISTO; Esa rutina la llamo en el Form_load() del formulario que tiene la
grilla para inicializarla..
NOTA: ten en cuenta que esta rutina siempre la debes incluir en el form
que tenga la grilla a iniciar; dado a que hay que definirle a mano todas
las propiedades específicas para la grilla en cuestión (por lo tanto
salvo casos especiales, dudo que la puedas poner en un módulo general
para reusar, ya que los nombres y propiedades varian de grilla en grilla
.... a lo mejor se podría hacer un grupo de clases con las propiedades a
setear para cada columna, pero creo que no tendría sentido ya que se
repetiría lo mismo...). De todas formas, yo copio siempre la estructura
esta que te paso, y la edito para cada caso particular.
Espero no haberte complicado demasiado y que te sea de utilidad...
Saludos
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Bueno he estado probando y me bloquea todas las columnas, no dejándome
editar las dos que necesito. Te comento con mas detalle. como lo tengo.
El VbFlexgrid. tiene su propiedad editable=1 - flexEDKbd.
Después el flex tiene 9 columnas: 0 a 8, en las cuales necesitamos
editar la 5 y la 6. Por propiedades tengo fijas la columna 0 y la row 0y
1. y el título de las dos columnas es "AJUSTES" y "AJUSTES", ya que
debajo llevan el DEBE (Columna5) y HABER (Columna6), el título AJUSTE
está realizado con .MergeCells = flexMergeFree
Private Sub Flex1_BeforeEdit(ByVal Row As Long, ByVal Col As Long,
Cancel As Boolean)
With Flex1
'Enumeramos las columnas que se pueden editar, o si son menos las
que no se editan, establece condiciones de igualdad
'//// If (Col <> .ColIndex(5)) And (Col <> .ColIndex(6)) Then
If (Col <> .ColIndex("AJUSTES")) And (Col <>
.ColIndex("AJUSTES")) Then
Cancel = False
End If
End With
End Sub
Pues estando así no me lo coge, por lo que creo que hago algo mal hecho,
lo he probado como verás también con index(5) y index(6), pero tampoco,
no dá ningún error, pero quedan todas las columnas bloqueadas, sin
permitir la edición en ninguna de ellas.
Fernando, no tengo experiencia en estas sentencias por lo que te rogaría
si puedes, le eches un vistazo a ver donde puede estar el error.
Te agradezco enormemente tu valiosa ayuda.
Un abrazo.
Gemma.
Post by ferg
Me alegro que te servido!...
Otro abrazo.
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Muchísimas gracias por tu respuesta tan bien aclarada y desarrollada.
Me he vuelto tonta, intentandolo todo, he mirado la Ayuda, los
ejemplos y no he encontrado nada. Ahora lo veo claro, voy a cambiar el
sistema de como lo tengo, por el que tu me has indicado.
Te quedo enormemente agradecida.
Recibe un fuerte abrazo.
Gemma.
Post by ferg
GEMMA, para "bloquear"/"fijar" una columna en el control VsFlexGrid,
solo puedes establecer la propiedad FixedCols a un valor distinto de
0, en cuyo caso, se fijará (quedarán como la fila 0 de titulos) la
cantidad establecida de columnas que se encuentran más a la
izquierda. Por ejemplo: Para .FixedCols=2 >> quedarán fijas las
columnas 0,1,2. No pudiendo especificar que determinada columna "del
medio" (por ejemplo la columna 4) quede fija.
Si en cambio, lo que deseas es evitar que cuando el control tiene la
propiedad .Editable = flexEDKbd; te editen determinadas columnas y
otras no... lo que puedes hacer es lo siguiente...
En el evento "BeforeEdit" (antes de editar) validas que la columna
que te estan editando no sea alguna de las que tu no permites, en
cuyo caso si es una de las que tu quieres evitar que se editen,
cancelas la edición con Cancel = True
Ejemplo....
Private Sub grilla_BeforeEdit(ByVal Row As Long, ByVal Col As Long,
Cancel As Boolean)
With grilla
If (Col <> .ColIndex("CANTIDAD")) And (Col <>
.ColIndex("P_UNIT")) Then 'enumeras las columnas que se pueden
editar, o si son menos las que no se editan, establece condiciones de
igualdad.
Cancel = True
End If
End With
End Sub
Saludos.
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemma
Precisaria fijar o bloquear unas columnas alternativas, es decir, la
1 y la 3 de un total de 5 por ejemplo, en un control VSFlexgrid que
lo tengo editable y no encuentro la forma de poder bloquearlas.
Os agradeceré que me podáis explicar como lo puedo hacer.
Recibid todos un saludo.
Gemma.