Programación General > Visual Basic 6.0 e inferiores
En MSHFlexgrid, no señalar casillas al iniciar una Form
(1/1)
lagunax:
Buen día. Se que no tiene mucho que pregunte algo (y obtuve una buena respuesta) pero hay una duda que no logro sacar de mi cabeza, ojala que sea tan sencillo de resolver como lo anterior.
En mi programa realizo una sección de busqueda en una BD Access 2003, filtro los datos de la BD mediante las opciones en un Combobox (ejemplo, campo Nombre) y aun puedo filtrar más mediante otro campo, al final los cargo en un MSHFlexgrid para desplegarlos. Al hacer click en el MSHFlexgrid, se obtiene el primer valor de cada fila (un ID) con el que realizo una busqueda y despliego en Textbox´s los valores del resto de los campos.
Ejemplo de encabezado de tabla (en gris): ID - NOMBRE - DESCRIPCION - SOLUCIONES
Cuando se encuentran registros, la fila siguiente al encabezado esta señalada en azul y me devuelve el ID de la fila.
El problema surge cuando selecciono una opción en el Combobox (ejemplo, busca NOMBRE = ALTIMIT), al no haber ninguna correspondencia, el MSHFlexgrid no despliega nada más que el encabezado anterior, pero marca toda la fila del encabezado. Cuando cambio a otra opcion que si me puede desplegar registros el indice (ID) se adelanta por uno, además que el MSHFlexgrid ya no me señala la fila entera al hacer click sobre el. Un ejemplo:
ID - NOMBRE - DESCRIPCION - SOLUCIONES --> Encabezado en Gris
1 JAVA PROGRAMA DESCARGAR --> Cuando haces click obtienes el ID de la fila
2 VB6 PROGRAMA DESCARGAR2 --> Cuando la tabla esta vacia y buscas por otro Nombre
3 FOXPRO APLICACION DESCARGA3 al hacer click en fila "ID = 2" te regresa el proximo valor
(aqui ID seria 3)
He probado con la propiedad Focusrect que es la que manipula la forma en que se señalan las celdas, pero no logro solucionar este problema. Cuando existen registros no surge este problema, solo cuando no hay resultados en la busqueda. Adjunto el codigo:
--- Código: Visual Basic --- Option ExplicitPublic bool As BooleanPublic bool2 As BooleanPublic auxi_grid As StringPublic pasar_id As IntegerPublic Numero As IntegerPublic ident As IntegerPublic auxi As Integer Public copia_id As IntegerPublic copia_nombre As StringPublic copia_descripcion As StringPublic copia_solucion_1 As String Public cn As ADODB.ConnectionPublic rst As ADODB.RecordsetSub Conectar() ' Crea una nueva conexión y un recordset Set cn = CreateObject("ADODB.Connection") Set rst = CreateObject("ADODB.Recordset") rst.CursorLocation = adUseClient ' abre la base de datos DIRECCION ANTERIOR' cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _' "Source=C:Program FilesMicrosoft " & _' "Visual StudioVB98SISTEMA BUSQUEDAAplicacion.MDB;Persist Security Info=False"'DIRECCION NUEVA DEL SERVIDOR \XOA008 cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _ "Source=\Xoa008COMPARTIDO SISTEMASSistema " & _ "de Registro & Solución de ProblemasBase de DatosAplicacion.MDB;Persist Security Info=False" End Sub Sub Desconectar()'MOSTRAR LA LISTA DE SOLUCIONES EN TEXT3.TEX' Form6.Text3.Text = rst("Solucion_1")'******************************************* rst.Close cn.Close Set rst = Nothing Set cn = NothingEnd Sub Private Sub Combo1_Click()Call Conectar rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Nombre Like '%" & _ Combo1.Text & "%'", cn, adOpenStatic, adLockOptimistic ' Muestra los datos en el FlexGridSet MSHFlexGrid1.DataSource = rst ' Visualiza la cantidad de registros filtradosMe.Caption = "Peugeot - Registros encontrados: " & CStr(rst.RecordCount) 'REVISA ESTE CAMBIO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'POSIBILIDAD PARA EVITAR QUE SE MANTENGA SELECCIONADA UNA CELDA Y'ASI EVITAR QUE SE CORRA EL REGISTRO'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++MSHFlexGrid1.FocusRect = flexFocusHeavy'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Call DesconectarEnd Sub Private Sub Command1_Click()'MARZO 5 - EVITAR ERROR AL PULSAR GUARDAR CON CAMPOS EN BLANCO'MARZO 9 - CAMBIOS REALIZADOS PARA SOLO GUARDAR LA SOLUCION'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ If Text6.Text = "" Then'If Text3.Text = "" And Text5.Text = "" And Text6.Text = "" And Combo2.Text = "" Then MsgBox ("No hay Datos para Modificar.")ElseCall Conectarrst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _ Text4.Text & "%'", cn, adOpenStatic, adLockOptimisticIf rst.EOF = True Then BeepElse Do While bool2 = False If rst.Fields("ID") = pasar_id Then 'rst.Fields("Nombre") = Combo2.Text 'rst.Fields("Descripcion") = Text5.Text rst.Fields("Solucion_1") = Text6.Text rst.Update MsgBox ("Se han guardado los cambios.") bool2 = True Command3.Enabled = False Else rst.MoveNext End If LoopEnd If rst.MoveFirstCall Desconectarbool2 = False MSHFlexGrid1.ClearCommand1.Enabled = FalseCommand4.Enabled = False End If'Call copy_auxiEnd Sub Private Sub Command2_Click() 'MARZO 5 - LIMPIEZA AL SALIR DE EDITAR/BORRAR'MARZO 9 - CAMPOS NO NECESARIOS TEXT3,5 Y COMBO2MSHFlexGrid1.ClearMSHFlexGrid1.RefreshText1.Text = ""Text2.Text = ""Text3.Text = ""'**********************Text4.Text = ""'Text5.Text = ""Text6.Text = ""Combo1.Text = ""'Combo2.Text = ""Form9.HideForm1.ShowEnd Sub Private Sub Command3_Click()'AGREGADO DEL 5 DE MARZO'MARZO 9 - CAMPOS INNECESARIOS'Combo2.Text = copia_nombre'Text5.Text = copia_descripcionText6.Text = copia_solucion_1'Call local_clear_auxiEnd Sub Private Sub Command4_Click()'On Error Resume Next'Se utiliza la línea On Error Resume Next para indicarle a Visual Basic que siga ejecutando'la forma, aún cuando ocurra un error de ejecución Call Conectarrst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _ Text4.Text & "%'", cn, adOpenStatic, adLockOptimisticIf rst.EOF = True Then BeepElseDo While bool2 = False'Do Until bool2 = True If rst.Fields("ID") = pasar_id Then '¿¿¿¿¿¿ crear variable para copiar 'MARZ0 5 MIDIFICADO 'rst.Fields("Nombre") = Combo2.Text 'rst.Fields("Descripcion") = Text5.Text 'rst.Fields("Solucion_1") = Text6.Text If MsgBox("Se va a eliminar el Registro, ¿Desea continuar?", vbExclamation + vbYesNo, "Eliminacion de Registros") = vbYes Then rst.Delete rst.Requery rst.MoveNext 'POSIBILIDAD PARA EVITAR QUE AL ELIMINAR N REGISTRO DESPLIEGUE DATOS ANTES DEL BORRADO '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'PARA EVITAR QUE AL ELIMINAR EL CURSOR DESPLIEGUE EL MISMO REGISTRO ELIMINADO 'A PESAR DE QUE EL RECORDSET YA AVANZO 'CALCULAR EL AVANCE DEL RECORSET ' Text3.Text = rst.Fields("ID") ' Combo2.Text = rst.Fields("Nombre") ' Text5.Text = rst.Fields("Descripcion") ' Text6.Text = rst.Fields("Solucion_1") ' If rst.EOF Then ' rst.MoveLast ' End If '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MsgBox ("Registro Eliminado con Éxito.") 'EVITA QUE DESPLIEGUE OTROS REGISTROS DESPUES DE ELIMINAR UNO++++++ 'MARZO 9 - CAMPOS INNECESARIOS Text3.Text = "" 'Combo2.Text = "" 'Text5.Text = "" Text6.Text = "" Command3.Enabled = False Command4.Enabled = False '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bool2 = True MSHFlexGrid1.Clear 'DESPLEGAR VALORES EN TABLA SEGUN APLICACION AL BORRAR '+++++++++++++++++++++++++++++++++++++++++++++++++++++ Call Desconectar Call Conectar rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Nombre Like '%" & _ Combo1.Text & "%'", cn, adOpenStatic, adLockOptimistic Set MSHFlexGrid1.DataSource = rst '+++++++++++++++++++++++++++++++++++++++++++++++++++++ Else MsgBox ("El Registro No fue Eliminado.") bool2 = True Command4.Enabled = False End If Else rst.MoveNext End IfLoopEnd If'COMENTAR PARA EVITAR QUE AL BORRAR ENVIE Y DESPLIEGUE AL PRIMER REGISTRO'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'rst.MoveFirst'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'Command4.Enabled = False Call Desconectarbool2 = False '/////////////////////////////// End Sub Private Sub Form_Load()MSHFlexGrid1.Clear With MSHFlexGrid1 .SelectionMode = flexSelectionByRow .FixedCols = 0 .ColWidth(0) = 700 .ColWidth(1) = 2000 .ColWidth(2) = 5000' .ColWidth(3) = 4000' .ColWidth(4) = 4000 End With Text2.Text = "" Text3.Text = ""End Sub Private Sub MSHFlexGrid1_Click()'///////////////////////////////////////////////////////////////////'CAMBIAR CADENAS STRING A INTEGER'Dim Cadena As String, Numero As Integer'Cadena = "12345.25"'Numero = CInt(Val(Cadena)) 'Esto te cambia la cadena a un numero enteroText1.Text = MSHFlexGrid1.Text auxi_grid = MSHFlexGrid1.TextNumero = CInt(Val(auxi_grid))Text4.Text = NumeroForm7.Text1.Text = ""'ENABLE EL BOTON DESHACER CUANDO SE HACE CLICK EN TABLA'OTRA OPCION SERIA ELIMINAR EL BOTON - SERIA MEJOR OPCION' PERMITIR MODIFICAR SOLO EL CAMPO SOLUCIONCommand3.Enabled = TrueCommand4.Enabled = TrueCommand1.Enabled = True'++++++++++++++++++++++++++++++++++++++++++++++++++++++++Call Conectar'CAMBIOS NUEVOS agregamos Solucionrst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _ Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic ' Para acceder a un campo: If rst.EOF = True Then Form7.Text1.Text = "" Else'CAMBIOS NUEVOS Adodc1.RecordSource = "SELECT * FROM TablaAplicacion"'CAMBIOS NUEVOS Adodc1.Refresh '/// With Adodc1.Recordset'/// If .EOF And .BOF Then'/// auxi = 0'/// Else If MSHFlexGrid1.Text = "" Then MsgBox "La Tabla esta Vacia" Else Do While bool = False 'PREGUNTAR SI HAY UN EOF O BOF PARA CUANDO NO HAY REGISTROS EN LA OPCION 'Y HACEN CLICK '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ If rst.BOF = True Or rst.EOF = True Then MsgBox ("No existen registros de esta Aplicación.") bool = True Else '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ If rst.Fields("ID") = Text4.Text Then Text3.Text = "" 'Combo2.Text = "" 'Text5.Text = "" Text6.Text = "" 'CAMBIOS 9 DE MARZO, SE BORRAN LOS CAMPOS DE ID,NOMBRE Y DESCRIPCION 'YA QUE SOLO SE DESEA MODIFICAR SOLUCION '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Text3.Text = rst.Fields("ID") 'Combo2.Text = rst.Fields("Nombre") 'Text5.Text = rst.Fields("Descripcion") '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Text6.Text = rst.Fields("Solucion_1") bool = True pasar_id = rst.Fields("ID") 'CAMBIO RECIENTE HOY 5 MARZO Call local_clear_auxi Call local_copy_auxi Else'CAMBIOS NUEVOS Adodc1.Recordset.MoveNext rst.MoveNext End If '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ End If '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Loop End If'/// End If'/// End With'CAMBIOS NUEVOS Adodc1.Recordset.MoveFirst 'CAMBIO RECIENTE End Ifrst.MoveFirstCall Desconectar auxi_grid = ""Numero = 0Text4.Text = ""bool = FalseEnd Sub Private Sub Text1_GotFocus() 'Text1.Text = ""End Sub Private Sub Text2_Change() ' conecta Call Conectar bool = False ' Ejecuta la consulta SQL'SENTENCIA SQL ORIGINAL' rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Descripcion Like '%" & _ ' Text2.Text & "%'", cn, adOpenStatic, adLockOptimistic rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Descripcion Like '%" & Text2.Text & "%' And Nombre Like '" & Combo1.Text & "'", cn, adOpenStatic, adLockOptimistic ' ' Para acceder a un campo: If rst.EOF = True Then ' Text3.Text = "" borrar text1 Text1.Text = "" Else'ULTIMA MODIFICIACION ADODC****************************************************** ident = rst("ID") Adodc1.RecordSource = "SELECT * FROM TablaAplicacion" Adodc1.Refresh Do While bool = False If Adodc1.Recordset.Fields("ID") = ident Then 'Text3.Text = Adodc1.Recordset.Fields("Solucion_1") 'IMPRIME SOLUCION EN TEXT3.TEXT CUANDO FILTRAS INFO bool = True Else Adodc1.Recordset.MoveNext End If Loop'******************************************************************************* ' GOOD Text3.Text = rst("Solucion_1") End If ' Enlaza el FlexGRid Set MSHFlexGrid1.DataSource = rst ' Cantidad de registros Me.Caption = "Registros encontrados: " & CStr(rst.RecordCount) ' Desconecta de la base de datos Call Desconectar If Text2.Text = "" Then 'Text3.Text = "" borrar text1 Text1.Text = "" End IfEnd Sub Private Sub Text2_GotFocus() Text2.Text = ""End Sub ''MODIFICACION RECIENTE 5 de marzo////////////////////////////////////////////' COPIA VARIABLES AUXI PARA BOTON DESHACER' NO COPIAR VALORES NO NECESARIOSPrivate Sub local_copy_auxi()'copia_id = TxtID.Text'copia_nombre = Combo2.Text'copia_descripcion = Text5.Textcopia_solucion_1 = Text6.TextEnd Sub Private Sub local_clear_auxi()copia_id = 0'copia_nombre = ""'copia_descripcion = ""copia_solucion_1 = ""End Sub
Aqui uso un modulo para el filtrado que mencione anteriormente:
--- Código: Visual Basic --- Function Autocompletar_FlexGrid(MSFlexGrid As Object, _ TBox As TextBox, _ Columna As Long) Dim i As IntegerDim pos_SelStart As Integer If (KeyRetroceso Or Len(TBox.Text) = 0) Then KeyRetroceso = False Exit Function End If With MSFlexGrid 'Recorremos todas las filas del MsFlexgrid For i = 0 To .Rows - 1 'Busca en el flexgrid si hay coincidencia, en la fila y columna actual If InStr(1, .TextMatrix(i, Columna), TBox.Text, vbTextCompare) = 1 Then pos_SelStart = TBox.SelStart 'Asignamos el valor de la celda actual al textbox TBox.Text = .TextMatrix(i, Columna) 'Indicamos el comienzo de la selección TBox.SelStart = pos_SelStart 'seleccionamos la porción de texto en el Text TBox.SelLength = Len(.TextMatrix(i, Columna)) - pos_SelStart ' Establecemos con TopRow , la fila arriba de todo .TopRow = i Exit For End If Next i End WithEnd Function
Solo espero haberme explicado bien. De antemano otra vez Gracias por la ayuda.
Navegación
Ir a la versión completa