Solved

Can I fill a DBgrid control without a Data control ?

Posted on 1998-09-14
7
262 Views
Last Modified: 2008-03-06
I want to know if I can fill a DBgrid control without a Data control and which one is better to use (which is faster). In case that yes, say me the first steps that I have do. Thanks
0
Comment
Question by:netkuk
  • 4
  • 3
7 Comments
 
LVL 1

Expert Comment

by:CarlosJac
ID: 1434841
Please, excuse me, my english is terrific ...

Yes, you can fill a DBGrid Control Without a Data Control.
Set DataMode property to 1 (Unbound).
Fill an array with the info to show in the grid.

You must to code the UnboundReadData event.

This example illustrates the use of the UnboundReadData event to read a row of data from a simple array (named UserData).
You must fill the UserData array with the info to show in the grid

Private Sub DBGrid1_UnboundReadData(ByVal RowBuf As RowBuffer, StartLocation As Variant, ByVal ReadPriorRows As Boolean)
Dim CurRow&, Row%, Col%, RowsFetched%, Incr%
                   
If ReadPriorRows Then
    Incr% = -1
Else
    Incr% = 1
End If

' If StartLocation is Null then start reading at the
' end or beginning of the data set.
If IsNull(StartLocation) Then
    If ReadPriorRows Then
        CurRow& = RowBuf.RowCount - 1
    Else
        CurRow& = 0

    End If
Else
    ' Find the position to start reading based on the
    ' StartLocation bookmark and the lngIncr% variable
    CurRow& = CLng(StartLocation) + Incr%
End If

' Transfer data from our data set array to the RowBuf
' object which DBGrid uses to display the data
For Row% = 0 To RowBuf.RowCount - 1
    If CurRow& < 0 Or CurRow& >= mTotalRows& Then Exit For
    For Col% = 0 To UBound(UserData, 1)
        RowBuf.Value(Row%, Col%) = UserData(Col%, CurRow&)

    Next Col%
    ' Set bookmark using CurRow& which is also our
    ' array index
    RowBuf.Bookmark(Row%) = CStr(CurRow&)
    CurRow& = CurRow& + Incr%
    RowsFetched% = RowsFetched% + 1
Next Row%
RowBuf.RowCount = RowsFetched%
End Sub


Good Luck
0
 

Author Comment

by:netkuk
ID: 1434842
Gracias. No es que no me satisfaga la solución. Todo lo contrario ! Lo único es que te agardeceria que me dijeses, des de la posición de programador en la que trabajas, que método és más eficiente (ràpido). Muchas gracias Carlos i espero tu respuesta (por cierto mi inglés también es terrífico así que mejor en español contigo que me parece que lo sabes muy bien.)
0
 
LVL 1

Accepted Solution

by:
CarlosJac earned 50 total points
ID: 1434843
Netkuk:
Qué bueno que hables español !
Si usas la DBGrid incluida en Visual Basic 5, la unica forma de cargar datos en forma unbound es la que te mostré en el código de ejemplo que te envié.  Se cargan los datos en un vector, y ese vector es lo que se muestra en la grilla a traves del evento Unbound_ReadData.
Esta forma es mucho más eficiente que trabajar con DataControl, es más rápida y te permite mucho mayor flexibilidad.  La desventaja es que (como ves en el ejemplo) requiere de mucho más trabajo de tu parte.
En sintesis: si lo más importante para tí es la eficiencia, la mejor forma es la unbound que te mostre en el ejemplo.

Si quieres gastar un poco de dinero puedes comprar la TrueDBGrid 5.0 de Apex (www.apexsc.com) que contiene toda la funcionalidad de la DBGrid y muchas otras capacidades.
Esta grilla tiene 3 modos unbound.  Uno de ellos es similar al de la DBGrid pero tiene mejor performance.  Tiene tambien otro modo unbound (storage) que tiene casi tan buena performance, pero no requiere codificación de eventos.

Mi consejo es: si con las capacidades de la DBGrid te alcanza, usala en modo unbound.  Si con la DBGrid no te alcanza podes comprar la TrueDBGrid 5, y obtener casi la misma performance pero sin codificar.

Buena Suerte.

Solo por curiosidad: qué idioma hablas ?  (Tu español es muy bueno)




0
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 

Author Comment

by:netkuk
ID: 1434844
Gracias por tu respuesta. ¡ Me ha ido de perfecta !


Por cierto, contestando a tu pregunta: soy de Barcelona, así que también hablo catalán.

0
 

Author Comment

by:netkuk
ID: 1434845
Por cierto, el ejemplo que me has dado lo he intentado implementar, o sea, lo he copiado en su correspondiente procedimiento del dbgrid (en el unbounddataread) y he creado el array userdata y lo he llenado. Sin embargo, cuando llamo al procedimiento con "dbgrid1_unbounddataread Rowbuff,1,true", me dice error 91. Yo he definido Rowbuf as Rowbuffer y luego Set Rowbuf=Rowbuffer. La verdad es que me he estado mirando la ayuda y no me acabo de enterar de como puñetas ver el contenido en el array.
Si me pudieras ayudar a completar el ejemplo que me has dado para que no me diera ese error y funcionara te lo agradeceria porque en lenguajes visuales tengo poca experiencia y tiendo a pensar y estructurar las cosas en "Topdown" con lo cual todos estos errores se me hacen una montaña.
Gracias de nuevo CarlosJac

0
 
LVL 1

Expert Comment

by:CarlosJac
ID: 1434846
Hola Netkuk:

Tu no tienes que ejecutar el evento unobundreaddata.  Tu tienes que llenar el vector userdata en el evento form_load.
Y tienes que copiar el codigo de ejemplo en el evento unboundreaddata de la grilla.  
Cuando la grilla necesita mostrar datos, por si sola ejecuta el evento unboundreaddata.
Tu no tienes que declarar Rowbuffer ni nada por el estilo.
Solo llenas el vector en el form_load y dejas que la grilla ejecute unboundreaddata cuando lo necesite.
Si me pasas tu direccion de correo electronico, puedo mandarte un form con una grilla unbound funcionando.

Suerte

CarlosJac
0
 

Author Comment

by:netkuk
ID: 1434847
Hola de nuevo CarlosJac.
Te digo los pasos que he hecho: he definido en "General" del formulario la tabla userdata(10,10) as string
He llenado mediante dos bucles anidados la tabla con mi nombre (p.ej)
He copiado el código que me dijiste y al ejecutar el pgm. no
me ha hecho nada.
Tambien he puesto un Dbgrid.refresh el el evento Click del Dbgrid
No sé si esto tiene algo que ver.
Te agradeceria que me pudieras enviar el código para que pudiera ver como tengo que ponerlo yo.
Puedes enviarme el códig a
guillrog_pratdesaba_prat@infomail.lacaixa.es
(un poquito larga...)
Gracias por las molestias CarlosJac.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Introduction While answering a recent question about filtering a custom class collection, I realized that this could be accomplished with very little code by using the ScriptControl (SC) library.  This article will introduce you to the SC library a…
The debugging module of the VB 6 IDE can be accessed by way of the Debug menu item. That menu item can normally be found in the IDE's main menu line as shown in this picture.   There is also a companion Debug Toolbar that looks like the followin…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

708 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now