B4J Library [B4X] [XUI] SD FlexGrid (Table)

I created a new library to show a table (or grid) similar to the one in EXCEL.

There are already excellent classes that allow many to accomplish things, such as xCustomListView by @Erel (B4X) and with the FlexibleTable by @klaus (B4A). I wanted to make something slightly different suited to my needs.

WARNING
The use of libraries for personal and / or commercial use is permitted. It is not allowed to modify the sources or change the name of the library. Reverse engineering is not authorized to access the sources for any reason, not even for study or learning reasons.

Explanations:
  1. To get the calculation of the cells that contain a formula I have added Erel's B4XEval to my Library, but as soon as possible I will make it external so that everyone can modify it according to their needs.
  2. To select multiple cells, position yourself on the first cell of those to be selected (the one at the top left) click a shot and then click again and drag your finger to cover all the cells (or area) that you want to select
  3. It is still in beta version, presents problems in large grids.
  4. Now only for B4A and B4i Now for B4A,B4i,B4j
  5. In the example to select a group of cells just long click on a cell (not checkbox). In the case of B4J click with the right mouse button

SD_FlexGrid

Author:
Star-Dust
Version: 0.31
  • Eval
    version 2.00
    Eval Method By Erel: https://www.b4x.com/android/forum/threads/b4x-eval-expressions-evaluator.54629/
    • Fields:
      • Error As Boolean
    • Functions:
      • Calculate (Expression As String) As Double
      • Class_Globals As String
      • Initialize (FG As FlexGrid) As String
      • IsInitialized As Boolean
        Verifica se l'oggetto sia stato inizializzato.
  • FlexGrid
    • Events:
      • CellClick (Row As Int, Col As Int)
      • CellLongClick (Row As Int, Col As Int)
      • HeadClick (Index As Int)
      • Modified (Row As Int, Col As Int)
      • ScrollX (Position As Double)
      • ScrollY (Position As Double)
    • Fields:
      • TypeButton As Int
      • TypeCheck As Int
      • TypeDouble As Int
      • TypeFloat As Int
      • TypeImage As Int
      • TypeInt As Int
      • TypeList As Int
      • TypeString As Int
    • Functions:
      • AddRow (Cell As Object(), Refresh As Boolean) As String
        eg. Flexgrid.AddRow(Array As Object(i,B,"User ","Description " ,100.00), True)
      • AddRow2 (Cell As Object(), HeightRow As Int, Refresh As Boolean) As String
        eg. Flexgrid.AddRow(Array As Object(i,B,"User ","Description " ,100.00),40dip,True)
      • AddRowAt (index As Int, Cell As Object(), Refresh As Boolean) As String
        eg. Flexgrid.AddRow(2,Array As Object(i,B,"User ","Description " ,100.00), True)
      • AddRowCustomize (Cell As Object(), Text_Color As Int, Background_Color As Int, TextFont As B4XFont, Refresh As Boolean) As String
      • AddToParent (Parent As B4XView, Left As Int, Top As Int, Width As Int, Height As Int, ColsNumber As Int) As String
        Parent is Panel to Add Grid
        eg. Flexgrid.AddToParent(Activity,0,0,100%x,100%y,5)
      • Class_Globals As String
      • ClearRows As String
        erase all rows contents
      • ClearSelection As String
        cell no longer be selected.
      • DesignerCreateView (Base As Object, Lbl As Label, Props As Map) As String
        Base type must be Object
      • EditCell (Row As Int, Col As Int) As String
        eg. Flexgrid.EditCell(1,1)
      • EditCellOnSite (Row As Int, Col As Int) As String
        eg. Flexgrid.EditCell(1,1)
      • GetCellBackgroundColor (Row As Int, Col As Int) As Int
      • GetCellCol (Col As Int) As Object()
        eg. Dim S() as String = Flexgrid.GetCellCol(1)
        eg. Dim B() as Boolean = Flexgrid.GetCellCol(2)
      • GetCellRow (Row As Int) As Object()
        eg Dim Row() as Object = Flexgrid.GetCellRow(1)
      • GetCellTextColor (Row As Int, Col As Int) As Int
      • GetCellTextFont (Row As Int, Col As Int) As B4XFont
      • GetCellValue (Row As Int, Col As Int) As Object
        eg. Dim I as int = Flexgrid.GetCellValue(1,1)
        eg. Dim S as String = FlexGrid.GetCellValue(2,2)
      • GetTypeCol (Col As Int) As Int
        eg. If Flexgrid.GetTypeCol(1)=Flexgrid.TypeInt Then .....
      • Initialize (Callback As Object, EventName As String) As String
      • Invalidate As String
      • IsInitialized As Boolean
        Verifica se l'oggetto sia stato inizializzato.
      • RemoveRow (Row As Int) As String
        Row (0...n-1)
        eg. Flexgrid.RemoveRow(1)
      • ResetCustomizeCell (Col As Int, Row As Int) As String
        eg. Flexgrid.ResetCustomizeCell(1,1)
      • SearchInColumn (Text As String, Col As Int, FromRow As Int, exactly As Boolean, IgnoreCap As Boolean) As Int
        Search for text in the indicated column starting from the start row.
        If the start row is 0 it will check the entire column.
        It will return the position of the line containing the text
        <code>Dim Col As Int = 5
        Dim Row As Int = FlexGied1.SearchInColumn("My text",Col,0, False, True)
        if Row>-1 then Log("Find in row " & Row) Else log("Don't find")
        </code>
      • SelectCell (Row As Int, Col As Int, Mobile As Boolean) As String
        eg. Flexgrid.SelectCell(1,1,True)
        If Mobile is True, the selectable area can be enlarged by touching and dragging it to the desired box.
      • SelectCells (FromRow As Int, FromCol As Int, ToRow As Int, ToCol As Int, Mobile As Boolean) As String
        eg. Flexgrid.SelectCell(1,1,5,4,True)
        If Mobile is True, the selectable area can be enlarged by touching and dragging it to the desired box.
      • SelectCol (Col As Int) As String
        eg. Flexgrid.SelectCol(1)
      • SelectRow (Row As Int) As String
        eg. Flexgrid.SelectRow(1)
      • SetCellCustomize (Row As Int, Col As Int, Text_Color As Int, Background_Color As Int, TextFont As B4XFont) As String
        eg. Flexgrid.SetCellCustomize(1,1,XUI.Color_Black,XUI.Color_White,XUi.CreateDefaultFont(12))
      • SetCellListIndex (Row As Int, Col As Int, Index As Int) As String
      • SetCellValue (Row As Int, Col As Int, Value As Object) As String
        eg. Flexgrid.SetCellValue(1,1,True)
        eg. Flexgrid.SetCellValue(2,2,"OK")
        eg. Flexgrid.SetCellValue(3,3,3)
        eg. Flexgrid.SetCellValue(Row,Col,"A,B,C,D,E") for TypeList
      • SetColAlignment (ColumnIndex As Int, Alignment As String) As String
        Index (0..n-1)
        eg. SetColAlignment(0,"CENTER")
      • SetColCustomize (Col As Int, Text_Color As Int, Background_Color As Int, TextFont As B4XFont) As String
        eg. Flexgrid.SetColCistomize(1,XUI.Color_Black,XUI.Color_White,XUi.CreateDefaultFont(12))
      • SetColName (ColumnIndex As Int, Name As String) As String
        Index (0..n-1)
        eg. Flexgrid.SetColName(1,"Help")
      • SetColsNumber (ColumnNumber As Int) As String
        Reset Grid and Change Cols Number
      • SetColType (ColumnIndex As Int, Typ As Int) As String
        Index (0..n-1)
        eg. SetColType(0,FlexGrid.TypeInt)
      • SetColWidth (ColumnIndex As Int, Width As Int) As String
        Index (0..n-1)
        eg. SetColWidth(0,100dip)
      • SetDataRow (Row As Int, Cell As Object()) As String
        eg. Flexgrid.SetRow(Row,Array As Object(i,B,"User ","Description " ,100.00))
      • SetDataRow2 (Row As Int, Cell As Object(), HeightRow As Int) As String
        eg. Flexgrid.SetRow2(Row,Array As Object(i,B,"User ","Description " ,100.00),40dip)
      • SetHeadHeight (Height As Int) As String
        Set Header Height
      • SetRowCustomize (Row As Int, Text_Color As Int, Background_Color As Int, TextFont As B4XFont) As String
        eg. Flexgrid.SetRowCustomize(1,XUI.Color_Black,XUI.Color_White,XUi.CreateDefaultFont(12))
      • SetRowHeight (IndexRow As Int, Height As Int) As String
        IndexRow (0..Size-1)
        eg. setRowHeight(0,60dip)
      • SetRowsHeight (Height As Int) As String
        Set all Rows Height
      • SortForCol (Column As Int) As String
    • Properties:
      • Base As B4XView [read only]
      • ColCount As Int [read only]
      • ColorSelectedArea As Int [write only]
      • ColorSelectingArea As Int [write only]
      • ColsAlignment
        eg. setColsAlignment(Array As String ("LEFT","CENTER","CENTER","RIGHT"))
      • ColsName As String()
        eg. Flexgrid.ColName=array As String ("First","Second")
      • ColsType
        eg. ColsType=Array As Int(FlexGrid1.TypeInt,FlexGrid1.TypeCheck,FlexGrid1.TypeString,FlexGrid1.TypeString,FlexGrid1.TypeFloat)
      • ColsWidth
        eg. SetColsWìdth(Array As Int (100dip,50dip,100dip,100dip))
      • Font
        eg. Flexgrid.Font=xui.CreateDefaultFont(12)
      • HeaderFont
        eg. Flexgrid.HeaderFont=xui.CreateDefaultFont(12)
      • RowCount As Int [read only]
        Dim Size as int = Flexgrid.RowCount
      • ScrollToRow
        eg. Flexgrid.ScroolToRow=50
      • ScrollX As Double
      • ScrollY As Double
      • SelectedColumnEnd As Int [read only]
        return -1 if not selected
      • SelectedColumnStart As Int [read only]
        return -1 if not selected
      • SelectedRowEnd As Int [read only]
        return -1 if not selected
      • SelectedRowStart As Int [read only]
        return -1 if not selected


Video1.gif
Video2.gif
Video4.gif

Video5.gif
Video6.gif
Video3.gif


List/Spinner
video7-gif.118379


For more details: https://www.b4x.com/android/forum/threads/xui-flexgrid.98686/

Significative release logs:
  • 0.12
    • Add method SelectCells (FromRow As Int, FromCol As Int, ToRow As Int, ToCol As Int, Mobile As Boolean)
    • Modify method SelectCell (Row As Int, Col As Int, Mobile As Boolean)
  • 0.15: Added HeaderFont
  • 0.16: Added SetColsNumber method.
  • 0.19 (Sample)
    • Add method AddRowCustomize (Cell As Object()
    • Add method SearchInColumn (Text As String, Col As Int, FromRow As Int, exactly As Boolean, IgnoreCap As Boolean) As Int
  • 0.21
    • Add TypeList. Allows you to add a ComboBox type box (Spinner in B4A and Picker in B4i) and select to a list
    • Added other examples to POST n. 2 To populate the grid from the database, search for a string in a column and to use TypeList in the grid
    • added SetCellListIndex method to change the position of the selected index
  • 0.25
    • Added SetHeadHeight method
      sets the height of the header
    • Added SetRowsHeight method
      sets the height of all lines
  • 0.27
    • added properties ScrollX and ScrollY
    • Added events ScrollX() and ScrollY()
  • 0.29: Fixed bugs in vertical scrolling
  • 0.31
    • Added SortForCol(Column As Int)
    • Added SetDataRow(Row As Int, Cell() As Object) and SetDataRow2(Row As Int, Cell() As Object, HeightRow As Int)
    • Added field ColorSelectedArea and ColorSelectingArea
    • Fix bug
 

Attachments

  • B4A Sample.zip
    31 KB · Views: 731
  • B4i Sample.zip
    24.2 KB · Views: 367
  • B4j Sample.zip
    23.9 KB · Views: 609
  • SD_FlexGrid 0.31.zip
    35.3 KB · Views: 21
  • jSD_FlexGrid 0.31.zip
    36.3 KB · Views: 17
  • iSD_FlexGrid.zip
    320 KB · Views: 14
Last edited:

Peter Simpson

Expert
Licensed User
Longtime User
In the future I plan to insert the following methods:
  • SearchInAllColumn: To search all columns
  • FilterView: To display only the lines that correspond to certain parameters described in the filter, for example display only the lines where there is a certain text

You're a busy little library creator @Star-Dust 👍
 

Star-Dust

Expert
Licensed User
Update 0.20
  • Fix bugs . Custom height row
 

Star-Dust

Expert
Licensed User
I have a problem with the FlexGrid.GetCellValue
It always returns the value of the last cell of the selected column.
I don't have enough information to understand what your problem is
 

Pravee7094

Active Member
Hello,
I have one doubt in your table.
Is there any feature to Hide columns?

For example, In that table I have one column named as itemnamePK, But I didn't want to show them to customer.
So I want to Hide that one column.

Any suggestion or Help?

Thanks
Praveen
 

Star-Dust

Expert
Licensed User
Hello,
I have one doubt in your table.
Is there any feature to Hide columns?

For example, In that table I have one column named as itemnamePK, But I didn't want to show them to customer.
So I want to Hide that one column.

Any suggestion or Help?

Thanks
Praveen
Set the column width to 0Dip with the SetColWidth method
 

Pravee7094

Active Member
Hello,

Can I able to modify cell value automatically?

For example:
First I just added a single row with two columns, column name is username and password.

B4X:
    Dim row(2) As Object
    row(0) = "Username"
    row(1) = "Password"
    
    if_flexgrid.AddRow(row, False)

And then I have a text field, If I enter some username in the text field and click submit, It will update or modify on the table column automatically.
I just tried this coding but not worked,

B4X:
Private Sub ip_editUsername_TextChanged (Old As String, New As String)
    is_username = New

    if_flexgrid.SetCellValue(1, 1, is_username)       

End Sub

Any suggestion or Help?

Thanks
 

Star-Dust

Expert
Licensed User
Update 0.21
  • Add TypeList. Allows you to add a ComboBox type box (Spinner in B4A and Picker in B4i) and select to a list
  • Added other examples to POST n. 2 To populate the grid from the database, search for a string in a column and to use TypeList in the grid
  • added SetCellListIndex method to change the position of the selected index

Example TypeList (FG_Sample2)
B4X:
FlexGrid1.ColsName=Array As String("ID","Sel","User","Img","Digit","List")
FlexGrid1.ColsType=Array As Int(FlexGrid1.TypeInt,FlexGrid1.TypeCheck,FlexGrid1.TypeString,FlexGrid1.TypeImage,FlexGrid1.TypeFloat,FlexGrid1.TypeList)

Dim ListItem As String =  "Jan,Feb,Mar,Apr,May,June,Jul"
For i=1 To 10
        FlexGrid1.AddRow(Array As Object(i,b,"User " & i,Null,Rnd(50,1000)/10,ListItem),True)
Next
 
Last edited:

Star-Dust

Expert
Licensed User
Update 0.23
  • Fix Bug
 

lelelor

Member
Licensed User
buongiorno, ora mi dice che manca jcore, sono un pochino imbranato ma sono all'inizio...

Impossibile trovare: C:\Program Files (x86)\Anywhere Software\Basic4android\libraries\jcore.jar
 

Star-Dust

Expert
Licensed User
imagine you are hearing B4j. jcore is the base library of b4j it is not possible that it is not present otherwise you have to install b4j again.

But if i instead you are using b4a then you have the wrong version of flexGrid. you must use the android version (aSD_FlexGrid)
 

Pravee7094

Active Member
Hello,
I have one column named as "Quantity" and datatype is "Float".
Now, How to check the empty value in the quantity column?

Ex:
If we going to edit the quantity column, Just clear the all values (make empty) and click the "Done" or "Next" button in the keypad.
It Shows the below message in the "Logs" tab:
B4X:
java.lang.NumberFormatException: empty String

How to check the empty value in number format?
In mobile screen, It shows the "Yes or No" message box. If we click yes, Nothing happened. that's ok. But if we click no, it will exit from the application.

Any Suggestion?

Thanks
 

Star-Dust

Expert
Licensed User
Hello,
I have one column named as "Quantity" and datatype is "Float".
Now, How to check the empty value in the quantity column?

Ex:
If we going to edit the quantity column, Just clear the all values (make empty) and click the "Done" or "Next" button in the keypad.
It Shows the below message in the "Logs" tab:
B4X:
java.lang.NumberFormatException: empty String

How to check the empty value in number format?
In mobile screen, It shows the "Yes or No" message box. If we click yes, Nothing happened. that's ok. But if we click no, it will exit from the application.

Any Suggestion?

Thanks
I guess the problem is related to B4J where you can't select the input type
 

amorosik

Expert
Licensed User
buongiorno, ora mi dice che manca jcore, sono un pochino imbranato ma sono all'inizio...

Impossibile trovare: C:\Program Files (x86)\Anywhere Software\Basic4android\libraries\jcore.jar

Tranquillo, pure io sono un pochino imbranato, anche se sono alla fine...

🤣🤣🤣
 
Top