DBGrid/MSFlex grid

Posted on 1998-11-09
Last Modified: 2013-12-25
I'm trying to create a bound grid with 2 columns one a date and the other a bunch of text. With DBGrid I cannot word wrap the text, with MSFlexgrid I cannot edit the data and with both I cannot use an edit mask for the date. Does anyone know of a solution to these problems, preferably without buying a third-party control? TIA, Ed.
Question by:schoon
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 13

Expert Comment

ID: 1488193
Doesn't the DBGrid have a wraptext in the property sheet. of the control?
LVL 13

Accepted Solution

Mirkwood earned 500 total points
ID: 1488194
This line is in the documentation of dbgrid

If a cell's text is too long to be displayed in the cell, the text wraps to the next line within the same cell. To display the wrapped text, you must increase the cell's Column object's Width property and/or the DBGrid control's RowHeight property. At design time, you can change the column width interactively by resizing the column or by changing the column's width in the Column object's property page.

In the properties, choose layout and select wraptext
LVL 13

Expert Comment

ID: 1488195
Make sure that your RowHeight is large enough. The DBgrid does not automaticly increase the rowheight.

The wraptext is a property of the column object.

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!


Expert Comment

ID: 1488196
Hello schoon

The following article is MSDN’s article which deal with grid editing issue. Please try it and if you have more questions I will answer you.
In any case, instead of simple TextBox you can put a MuskEdit, which will help you both edit and wrap any cell and cell’s text.

How to Edit Grid Cells in VB Using Overlapped Text Box

The Grid custom control does not provide any text editing capability. The example program below shows how you can use a text box to perform text editing in the current cell of a grid.

The example program shown below enables you to edit the contents of a grid cell. When you press a key, the grid moves a text box to the position of the current cell and sets the focus to the text box. When you press the ENTER key or change focus away from the current cell, the program transfers the text in the text box back to the grid.

Steps to Create Example Program

Start Visual Basic or from the File menu, choose New Project (ALT, F, N) if Visual Basic is already running. Form1 is created by default.

From the Tools menu, choose Custom Controls. Then check the Microsoft Grid Control check box. Click OK.

Place a grid (Grid1) and a text box (Text1) on Form1. Set the Grid1 Cols and Rows properties both to 4. Then size the grid to show all the cells. Set the Text1 BorderStyle property to None (0) and the Visible property to False (0).

Enter the following declarations in the general Declarations section:

   Const ASC_ENTER = 13        ' ASCII code of ENTER key.
   Dim gRow As Integer
   Dim gCol As Integer

Enter the following code in the Grid1_KeyPress procedure:

   Private Sub Grid1_KeyPress (KeyAscii As Integer)
      ' Move the text box to the current grid cell:
      Call grid_text_move(Grid1, Text1)

      ' Save the position of the grids Row and Col for later:
      gRow = Grid1.Row
      gCol = Grid1.Col

      ' Make text box same size as current grid cell:
      Text1.Width = Grid1.ColWidth(Grid1.Col) - 2 * Screen.TwipsPerPixelX
      Text1.Height = Grid1.RowHeight(Grid1.Row) - 2 * Screen.TwipsPerPixelY

      ' Transfer the grid cell text:
      Text1.Text = Grid1.Text

      ' Show the text box:
      Text1.Visible = True
      Text1.ZOrder 0

      ' Redirect this KeyPress event to the text box:
      If KeyAscii <> ASC_ENTER Then
         SendKeys Chr$(KeyAscii)
      End If
   End Sub

Add the following code to the Text1_KeyPress procedure:

   Private Sub Text1_KeyPress (KeyAscii As Integer)
      If KeyAscii = ASC_ENTER Then
         Grid1.SetFocus  ' Set focus back to grid, see Text_LostFocus.
         KeyAscii = 0    ' Ignore this KeyPress.
      End If
   End Sub

Add the following code to the Text1_LostFocus procedure:

   Private Sub Text1_LostFocus ()
      Dim tmpRow As Integer
      Dim tmpCol As Integer

      ' Save current settings of Grid Row and col. This is needed only if
      ' the focus is set somewhere else in the Grid.
      tmpRow = Grid1.Row
      tmpCol = Grid1.Col

      ' Set Row and Col back to what they were before Text1_LostFocus:
      Grid1.Row = gRow
      Grid1.Col = gCol

      Grid1.Text = Text1.Text  ' Transfer text back to grid.
      Text1.SelStart = 0       ' Return caret to beginning.
      Text1.Visible = False    ' Disable text box.

      ' Return row and Col contents:
      Grid1.Row = tmpRow
      Grid1.Col = tmpCol
   End Sub

In the general Declarations section or in a separate .BAS file, add the following Sub routine:
Public Sub grid_text_move (Grid As Control, TextBox As Control)

      ' Move a text box to the position of the current cell in a grid:
      Dim X As Single   ' x position of current grid cell.
      Dim Y As Single   ' y position of current grid cell.
      Dim i As Integer  ' Column/row index.

      ' Skip grid border:
      X = Grid.Left
      Y = Grid.Top
      If Grid.BorderStyle = 1 Then
         X = X + Screen.TwipsPerPixelX
         Y = Y + Screen.TwipsPerPixelY
      End If

      ' Skip fixed columns and rows:
      For i = 0 To Grid.FixedCols - 1
         X = X + Grid.ColWidth(i)
         If Grid.GridLines Then
            X = X + Screen.TwipsPerPixelX
         End If
      For i = 0 To Grid.FixedRows - 1
         Y = Y + Grid.RowHeight(i)
         If Grid.GridLines Then
            Y = Y + Screen.TwipsPerPixelY
         End If

      ' Find current data cell:
      For i = Grid.LeftCol To Grid.Col - 1
          X = X + Grid.ColWidth(i)
          If Grid.GridLines Then
              X = X + Screen.TwipsPerPixelX
          End If
      For i = Grid.TopRow To Grid.Row - 1
          Y = Y + Grid.RowHeight(i)
          If Grid.GridLines Then
              Y = Y + Screen.TwipsPerPixelY
          End If

      ' Move the Text Box, and make small adjustments:
      TextBox.Move X + Screen.TwipsPerPixelX, Y + Screen.TwipsPerPixelY
   End Sub

Press the F5 key to run the program. Press a key to begin entering text into a cell. Type in some text. Press the ENTER key to finish editing the cell. Use the arrow keys to move to another cell. You can press the ENTER key to begin editing a cell without changing the contents of the cell.


Good Luck

Expert Comment

ID: 1488197
You may want to just add another form and pass those values to it . . edit them . . then update the flex grid.   I hope this gives you more ideas.

Private Sub grdFlexGrid_DblClick()

    Dim lRowSel As Long
    frmUpdateGrid.Caption = "Update Grid"
    lRowSel = grdFlexGrid.RowSel
    frmUpdateGrid.txtField1 = grdFlexGrid.TextMatrix(lRowSel, 2)
    frmUpdateGrid.cboField2 = grdFlexGrid.TextMatrix(lRowSel, 3)
    frmUpdateGrid.cboField3 = grdFlexGrid.TextMatrix(lRowSel, 4)
    frmUpdateGrid.Show vbModal

End Sub


Author Comment

ID: 1488198
Thankyou. I am trying to split the points between you and schild since you both  answered part of it.

Author Comment

ID: 1488199
Schild and BHimmerick thankyou for your answers. I tried to split the points between you and Mirkwood but I couldn't.

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

There are many ways to remove duplicate entries in an SQL or Access database. Most make you temporarily insert an ID field, make a temp table and copy data back and forth, and/or are slow. Here is an easy way in VB6 using ADO to remove duplicate row…
When designing a form there are several BorderStyles to choose from, all of which can be classified as either 'Fixed' or 'Sizable' and I'd guess that 'Fixed Single' or one of the other fixed types is the most popular choice. I assume it's the most p…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
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…

730 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