Usar MSFlexGrid

tyloya
08 de Junio del 2004
Hola

Tengo unas dudas con un MSFlexGrid.Mi problema es que lo uso para ir mostrando líneas con nombre de concepto, cantidad, precio,iva, etc .....estas líneas se van añadiendo al flex cuando antes he rellenado unos campos y pulso un botón.
Ahora bien, cómo puedo hacer que cuando seleccione una línea del flex, esos datos aparezcan en los campos de texto correspondientes, y si modifico los valores de los campos, éstos se modifiquen en la línea correspondiente del Msflex??...
Si podéis enviar un ejemplo me vendría muy bien
Gracias

sdemingo
08 de Junio del 2004
Hola,

te pongo un ejemplo de lo que quieres.

necesitas un grid llamado mfGrid, un botón llamado Command1 y tres cajas de texto llamadas Text1, Text2 y Text3

Option Explicit
Private Const nColumnas As Integer = 3

Private Sub Command1_Click()

If mfGrid.Row = 0 Then
MsgBox "Seleccione una file del grid"
Else
mfGrid.RemoveItem (mfGrid.Row)
Me.mfGrid.AddItem Text1.Text & vbTab & Text2.Text & vbTab & Text3.Text
End If

End Sub

Private Sub Form_Load()

Me.mfGrid.AllowUserResizing = 3
'Número de columnas fijas
mfGrid.FixedCols = 0
'Número de filas fijas
mfGrid.FixedRows = 0
'Mostramos el Scroll horizaontal y el vertical
mfGrid.ScrollBars = 3
'Numero de Filas
mfGrid.Rows = 1
mfGrid.FocusRect = flexFocusLight
mfGrid.GridLines = flexGridRaised
'Numero de Columnas a mostrar
ReDim FixedColCaptions(nColumnas - 1)

'Cabecera
FixedColCaptions(0) = "IDENTIFICADOR"
FixedColCaptions(1) = "NOMBRE"
FixedColCaptions(2) = "DESCRIPCIÓN"

'Nos situamos en la fila 0
mfGrid.Row = 0
'Numero de Columnas
mfGrid.Cols = nColumnas

Dim j As Long
Dim k As Long
Dim i As Integer

'Rellenamos la cabecera de la filas fijas
For j = 0 To mfGrid.Cols - 1
mfGrid.Col = j
Select Case j
Case 0
mfGrid.ColWidth(j) = 1400
Case 1
mfGrid.ColWidth(j) = 2100
Case 2
mfGrid.ColWidth(j) = 2500
End Select
mfGrid.Text = FixedColCaptions(j)
mfGrid.HighLight = flexHighlightWithFocus
mfGrid.CellBackColor = RGB(100, 255, 0)
Next


Me.mfGrid.AddItem "0001" & vbTab & "Casco Urbano" & vbTab & "Es el casco urbano del municipio"
Me.mfGrid.AddItem "0002" & vbTab & "Suelo Urbanizable" & vbTab & "Destinado para construir"
Me.mfGrid.AddItem "0003" & vbTab & "Suelo no Urbanizable" & vbTab & "Prohibido construir"

End Sub

Private Sub mfGrid_Click()

If mfGrid.Row <> 0 Then
Text1.Text = Me.mfGrid.TextMatrix(mfGrid.Row, 0)
Text2.Text = Me.mfGrid.TextMatrix(mfGrid.Row, 1)
Text3.Text = Me.mfGrid.TextMatrix(mfGrid.Row, 2)
End If

End Sub

salu2
sdemingo
http://boards.melodysoft.com/sdemingo


tyloya
08 de Junio del 2004
Perdona, pero dónde encuentro el componente mfgrid?

sdemingo
08 de Junio del 2004
mfGrid es el nombre que le he dado al control MSFlexGrid.

En el código cambia mfGrid por el nombre con que hayas llamado al control (MSFlexGrid1??)

salu2
sdemingo

tyloya
08 de Junio del 2004
Estoy un poco lenta de reflejos esta mañna...jejeje..
Ese es el que estoy utilizando, voy a ver el ejemplo que me has mandado para hacer lo que quiero.

tyloya
08 de Junio del 2004
Hola de nuevo.
Tengo un problema,....sabes porqué no me deja eliminar del msflexgrid un fila, si sólo hay una fila??

Y habría alguna forma de que el usuario se situase en la fila que quisiera del flex y pudiera editar los valores?.....yo uso una tabla de una base de datos para guardar los valores finales del msflexgrid, y me parece que resultaría complicado andar modificando y detectando cuándo se ha modificado una fila del flex para actualizar su valor en la tabla..


sdemingo
08 de Junio del 2004
Hola,

no se si habrás probado mi ejemplo, pero si que te deja eliminar una fila aunque solo haya una.

Para editar los valores en el mismo grid tienes que hacer una chapuza con cajas de texto sobre las celdas.

Te paso un ejemplo que hice hace tiempo.

'********************************************************************************
' NOMBRE: GridEdit
' TIPO: PROCEDIMIENTO
' PARÁMETROS:
' KeyAscii: Tecla pulsada
' frmForm: Formulario al que pertenece el grid
' EXPLICACIÓN: Edita el grid
' CREADO POR: AIAL
' FECHA: 23/10/2001
' MODIFICADA POR:
' FECHA MODIFICACIÓN:
'********************************************************************************
Sub GridEdit(KeyAscii As Integer, frmForm As Form)

Dim bValorBooleano As Boolean

On Error GoTo GridEdit_Err

bValorBooleano = False
'La segunda y tercera condición, para que no se pueda editar el identificador y el tipo
'de Ámbito
' If frmForm.mfGrid.Row <> 0 And frmForm.mfGrid.Col <> 0 And frmForm.mfGrid.Col <> 1 Then
If frmForm.mfGrid.Row <> 0 Then

If frmForm.mfGrid = strSi Or frmForm.mfGrid = strNo Then
bValorBooleano = True
End If
'Usa la fuente correcta
frmForm.textoGrid.FontName = frmForm.mfGrid.FontName
frmForm.textoGrid.FontSize = frmForm.mfGrid.FontSize
Select Case KeyAscii
Case 0 To Asc(" ")
If bValorBooleano Then
If frmForm.mfGrid = strVerdadero Then
frmForm.checkGrid = 1
Else
frmForm.checkGrid = 0
End If
Else
frmForm.textoGrid = frmForm.mfGrid
frmForm.textoGrid.SelStart = 1000
End If
Case Else
frmForm.textoGrid = Chr(KeyAscii)
frmForm.textoGrid.SelStart = 1
End Select
'Si la celda del grid es de tipo booleano, se muestra un check box
If bValorBooleano Then
'Posiciona el check box encima de cada celda del grid
frmForm.checkGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.checkGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.checkGrid.Width = frmForm.mfGrid.CellWidth
End If
frmForm.checkGrid.Height = frmForm.mfGrid.CellHeight
frmForm.checkGrid.Visible = True
frmForm.checkGrid.SetFocus
Else
Select Case frmForm.Name
'AMBITOS
Case strFormAmbito
If frmForm.mfGrid.Col = iColAmbitoNombre Then

frmForm.textoGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.cGrid.Width = frmForm.mfGrid.CellWidth
End If
' frmForm.cGrid.Height = frmForm.mfGrid.CellHeight
' frmForm.cGrid.SetFocus
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoNombre) <> "" Then
frmForm.cGrid.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoNombre)
End If
frmForm.cGrid.Visible = True
frmForm.cGrid.SetFocus
ElseIf frmForm.mfGrid.Col = iColAmbitoMedida Then
frmForm.cUnidades.Visible = False
frmForm.textoGrid.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cUnidades.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cUnidades.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
' frmForm.cUnidades.Width = frmForm.cUnidades.CellWidth
End If
' frmForm.cUnidades.Height = frmForm.mfGrid.CellHeight
' frmForm.cUnidades.SetFocus
'Comentado 10/12/2001
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoMedida) <> "" Then
frmForm.cUnidades.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoMedida)
End If
frmForm.cUnidades.Visible = True
frmForm.cUnidades.SetFocus
ElseIf frmForm.mfGrid.Col = iColAmbitoAlcance Then
' ***************************************************************************************
' Modificado por SMC el 3 de Mayo de 2004 debido a crea una inconsistencia con la *
' información del dibujo de AutoCAD solo se permite modificar el alcance al dar de alta *
' ***************************************************************************************
If bAltaAmbito Then ' si se está dando de alta el ámbito
frmForm.cCategoria.Visible = False
frmForm.textoGrid.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cCategoria.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cCategoria.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
End If
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoAlcance) <> "" Then
frmForm.cCategoria.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoAlcance)
End If
frmForm.cCategoria.Visible = True
frmForm.cCategoria.SetFocus
bAltaAmbito = False
End If
ElseIf frmForm.mfGrid.Col = iColAmbitoObservaciones Then
Select Case KeyAscii
Case 0 To Asc(" ")
frmForm.txtObservGrid = frmForm.mfGrid
frmForm.txtObservGrid.SelStart = 1000
Case Else
frmForm.txtObservGrid = Chr(KeyAscii)
frmForm.txtObservGrid.SelStart = 1
End Select


'Pongo a invisible el combo de los tipo de ámbitos
frmForm.cGrid.Visible = False
'frmForm.checkGrid.Visible = False
frmForm.cUnidades.Visible = False
frmForm.textoGrid.Visible = False

'Posiciona la caja de texto encima de cada celda del grid
frmForm.txtObservGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.txtObservGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.txtObservGrid.Width = frmForm.mfGrid.CellWidth
End If
frmForm.txtObservGrid.Height = frmForm.mfGrid.CellHeight
frmForm.txtObservGrid.Visible = True
frmForm.txtObservGrid.SetFocus
Else
'Pongo a invisible el combo de los tipo de ámbitos
frmForm.cGrid.Visible = False
frmForm.cUnidades.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona la caja de texto encima de cada celda del grid
frmForm.textoGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.textoGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.textoGrid.Width = frmForm.mfGrid.CellWidth
End If
frmForm.textoGrid.Height = frmForm.mfGrid.CellHeight
frmForm.textoGrid.Visible = True
frmForm.textoGrid.SetFocus
End If
'AMBITOS INFORMACION
Case strFormAmbitoInformacion
If frmForm.mfGrid.Row <> 0 And frmForm.mfGrid.Col <> 0 And frmForm.mfGrid.Col <> 1 Then
If frmForm.mfGrid.Col = iColAmbitoNombre Then

frmForm.textoGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.cGrid.Width = frmForm.mfGrid.CellWidth
End If
' frmForm.cGrid.Height = frmForm.mfGrid.CellHeight
' frmForm.cGrid.SetFocus
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoNombre) <> "" Then
frmForm.cGrid.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoNombre)
End If
frmForm.cGrid.Visible = True
frmForm.cGrid.SetFocus
ElseIf frmForm.mfGrid.Col = iColAmbitoMedida Then
frmForm.cUnidades.Visible = False
frmForm.textoGrid.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cUnidades.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cUnidades.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
' frmForm.cUnidades.Width = frmForm.cUnidades.CellWidth
End If
' frmForm.cUnidades.Height = frmForm.mfGrid.CellHeight
' frmForm.cUnidades.SetFocus
'Comentado 10/12/2001
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoMedida) <> "" Then
frmForm.cUnidades.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoMedida)
End If
frmForm.cUnidades.Visible = True
frmForm.cUnidades.SetFocus
ElseIf frmForm.mfGrid.Col = iColAmbitoAlcance Then
frmForm.cCategoria.Visible = False
frmForm.textoGrid.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cCategoria.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cCategoria.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
' frmForm.cUnidades.Width = frmForm.cUnidades.CellWidth
End If
' frmForm.cUnidades.Height = frmForm.mfGrid.CellHeight
' frmForm.cUnidades.SetFocus
'Comentado 10/12/2001
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoAlcance) <> "" Then
frmForm.cCategoria.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoAlcance)
End If
frmForm.cCategoria.Visible = True
frmForm.cCategoria.SetFocus
ElseIf frmForm.mfGrid.Col = iColAmbitoObservaciones Then
Select Case KeyAscii
Case 0 To Asc(" ")
frmForm.txtObservGrid = frmForm.mfGrid
frmForm.txtObservGrid.SelStart = 1000
Case Else
frmForm.txtObservGrid = Chr(KeyAscii)
frmForm.txtObservGrid.SelStart = 1
End Select


'Pongo a invisible el combo de los tipo de ámbitos
frmForm.cGrid.Visible = False
'frmForm.checkGrid.Visible = False
frmForm.cUnidades.Visible = False
frmForm.textoGrid.Visible = False

'Posiciona la caja de texto encima de cada celda del grid
frmForm.txtObservGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.txtObservGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.txtObservGrid.Width = frmForm.mfGrid.CellWidth
End If
frmForm.txtObservGrid.Height = frmForm.mfGrid.CellHeight
frmForm.txtObservGrid.Visible = True
frmForm.txtObservGrid.SetFocus
Else
'Pongo a invisible el combo de los tipo de ámbitos
frmForm.cGrid.Visible = False
frmForm.cUnidades.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona la caja de texto encima de cada celda del grid
frmForm.textoGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.textoGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.textoGrid.Width = frmForm.mfGrid.CellWidth
End If
frmForm.textoGrid.Height = frmForm.mfGrid.CellHeight
frmForm.textoGrid.Visible = True
frmForm.textoGrid.SetFocus
End If
End If
'ELEMENTOS INFRAESTRUCTURA
Case strFormElementosInfraestructura
If frmForm.mfGrid.Col = iColInfraTipo Then

frmForm.textoGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.cGrid.Width = frmForm.mfGrid.CellWidth
End If
' frmForm.cGrid.Height = frmForm.mfGrid.CellHeight
' frmForm.cGrid.SetFocus
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoNombre) <> "" Then
frmForm.cGrid.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColAmbitoNombre)
End If
frmForm.cGrid.Visible = True
frmForm.cGrid.SetFocus
' ElseIf frmForm.mfGrid.Col = iColInfraObservaciones Or _
' frmForm.mfGrid.Col = iColInfraDescripcion Then
ElseIf frmForm.mfGrid.Col = iColInfraObservaciones Then
Select Case KeyAscii
Case 0 To Asc(" ")
frmForm.txtObservGrid = frmForm.mfGrid
frmForm.txtObservGrid.SelStart = 1000
Case Else
frmForm.txtObservGrid = Chr(KeyAscii)
frmForm.txtObservGrid.SelStart = 1
End Select


'Pongo a invisible el combo de los tipo de ámbitos
frmForm.cGrid.Visible = False
'frmForm.checkGrid.Visible = False
frmForm.textoGrid.Visible = False

'Posiciona la caja de texto encima de cada celda del grid
frmForm.txtObservGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.txtObservGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.txtObservGrid.Width = frmForm.mfGrid.CellWidth
End If
frmForm.txtObservGrid.Height = frmForm.mfGrid.CellHeight
frmForm.txtObservGrid.Visible = True
frmForm.txtObservGrid.SetFocus
ElseIf frmForm.mfGrid.Col = iColInfraAlcance Then
frmForm.cCategoria.Visible = False
frmForm.textoGrid.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona el check box encima de cada celda del grid
frmForm.cCategoria.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.cCategoria.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
' frmForm.cUnidades.Width = frmForm.cUnidades.CellWidth
End If
' frmForm.cUnidades.Height = frmForm.mfGrid.CellHeight
' frmForm.cUnidades.SetFocus
'Comentado 10/12/2001
If frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColInfraAlcance) <> "" Then
frmForm.cCategoria.Text = frmForm.mfGrid.TextMatrix(frmForm.mfGrid.Row, iColInfraAlcance)
End If
frmForm.cCategoria.Visible = True
frmForm.cCategoria.SetFocus
Else
'TODAS LAS DEMÁS COLUMNAS
'Pongo a invisible el combo de los tipo de ámbitos
frmForm.cGrid.Visible = False
frmForm.txtObservGrid.Visible = False

'Posiciona la caja de texto encima de cada celda del grid
frmForm.textoGrid.Left = frmForm.mfGrid.CellLeft + frmForm.mfGrid.Left
frmForm.textoGrid.Top = frmForm.mfGrid.CellTop + frmForm.mfGrid.Top
If frmForm.mfGrid.CellWidth > 0 Then
frmForm.textoGrid.Width = frmForm.mfGrid.CellWidth
End If
frmForm.textoGrid.Height = frmForm.mfGrid.CellHeight
frmForm.textoGrid.Visible = True
frmForm.textoGrid.SetFocus

End If
End Select
End If
End If

'********************
'Error
'********************
Exit Sub
GridEdit_Err:
MsgBox "GridEdit_Err:" & Err & ". " & Err.Description & " en la línea: " & Erl & ".", vbExclamation + vbOKOnly, "Error."

End Sub

salu2
sdemingo
http://boards.melodysoft.com/sdemingo

tyloya
08 de Junio del 2004
Me parece que lo haré de la otra forma....;.-)....me he asustado!!!
De todas formas guardaré el ejemplo por si me sirve.
Gracias