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
Reitero las gracias de todo corazón por tu ayuda.
Un abrazo muy grande.
Gemma.
Post by ferggemma; 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 gemmaBueno 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 fergMe alegro que te servido!...
Otro abrazo.
--
Ing. Fernando D. Giletta
MP: 4035 CIEC
San Fco. Cba. Arg.
Post by gemmaMuchí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 fergGEMMA, 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 gemmaPrecisaria 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.