0

I have a code that import my table on a listbox and able to add on it.

I was stuck on some code when I double click a selected value on my listbox to open another dialogbox to edit (the selected value) it as well as on my table.

Here is my code:

Include "Mapbasic.def"
 
Declare Sub Main
Declare Sub AddItemDialog
Declare Sub AlterMainDialog
declare sub editlistDialog
declare sub Nodelist(byval sId as string) 
dim listboxValues() as string
declare sub listbox_edit
'---------------------------------------------------------------------------
Sub Main
 
 Dialog Title "Main Dialog" Width 150 Height 80 calling editlistDialog
 Control ListBox Position 13, 7 Width 100 Height 50 ID 1 Title from variable listboxValues calling listbox_edit
 Control Button Title "Add Item" ID 2 Calling AddItemDialog
 Control OkButton
 Control CancelButton
 
End Sub
'---------------------------------------------------------------------------
Sub AddItemDialog
 
 Dim strAddItem as String
 
 Dialog Title "Add Item Dialog"
 Control EditText Width 100 Into strAddItem
 Control OkButton Title "Add" 
 Control CancelButton
 
 If CommandInfo(CMD_INFO_DLG_OK) Then
 Dim i as Integer
 i = Ubound(listboxValues)
 Redim listboxValues( i + 1)
 i = Ubound(listboxValues)
 listboxValues(i) = strAddItem
 
 insert into subn(lname)
 values(strAddItem) 
 
 Call AlterMainDialog
 End If
 
End Sub
'---------------------------------------------------------------------------
Sub AlterMainDialog
 
 Alter Control 1 Title from variable listboxValues
 
End Sub
'---------------------------------------------------------------------------
sub editlistDialog
 call Nodelist("5350") 
 alter control 1 title from variable listboxValues
End Sub
'---------------------------------------------------------------------------
sub Nodelist(byval sId as string)
 dim i as integer
 dim nRows as integer
 
 select * from subn where site=sId into lstValues noselect
 nRows=tableinfo("lstValues",tab_info_nrows)
 redim listboxValues(nrows)
 for i = 1 to tableinfo("lstValues",tab_info_nrows)
 fetch rec i from lstValues
 listboxValues(i)=lstValues.lname
 Next
End Sub
'---------------------------------------------------------------------------
Sub listbox_edit
 Dim i as string
 If CommandInfo(CMD_INFO_DLG_DBL) = TRUE Then 
 ' ...then the user DOUBLE-clicked. 
 ' see which list item the user clicked on. 
 i = ReadControlValue(1) 
 print i
 'Should try to look the table and edit list
 
 End If
End Sub
PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked May 10, 2015 at 11:01

1 Answer 1

2

Here are some suggestions:

At the top add another array variable to hold the rowids from the query you get your values from. Just add the last line. The first line helps you to see where to add it:

dim listboxValues() as string
dim arrRecordRowIDs() as Integer

You have to fill this array with the rowids of the records in the NodeList procedure:

 redim listboxValues(nrows)
 Redim arrRecordRowIDs(nrows)
 for i = 1 to tableinfo("lstValues",tab_info_nrows)
 fetch rec i from lstValues
 listboxValues(i) = lstValues.lname
 arrRecordRowIDs(i) = lstValues.ROWID
 Next

Next step is to change your current way to insert a new record slightly in the AddItemDialog procedure. Instead of calling AlterMainDialog when you have inserted the new record, you call editlistDialog to reload all the elements and create a new query. When you do this you donøt have to add the element to the array of values first. The reason for doing this is that you need to be able to update it later on, potentially, and you can only do this if the value is in the query:

If CommandInfo(CMD_INFO_DLG_OK) Then
 insert into subn (lname)
 values (strAddItem) 
 Call editlistDialog
End If

Now we need to get you listbox_edit procedure finished:

Sub listbox_edit
 Dim sValue as String
 Dim nItem As Integer
 If CommandInfo(CMD_INFO_DLG_DBL) = TRUE Then
 '**Get the currently selected record
 nItem = ReadControlValue(1)
 sValue = listboxValues(nItem) 
 print nItem & " = " & sValue
 '**Shop the value in the dialog and read what the user changed it to
 Dialog Title "Change Item Dialog"
 Control EditText Width 100 
 Value sValue 
 Into sValue
 Control OkButton 
 Title "Update" 
 Control CancelButton
 If CommandInfo(CMD_INFO_DLG_OK) Then
 '**Update the array
 listboxValues(nItem) = sValue
 '**Update the record in the query (and so in the base table)
 Update lstValues
 Set lname = sValue
 Where ROWID = arrRecordRowIDs(nItem)
 '**Refresh the list in the dialog
 Call AlterMainDialog
 End If
 End If
End Sub

Deleting a record is basically done so:

Sub listbox_delete
 Dim sValue as String
 Dim nItem As Integer
 '**Get the currently selected record
 nItem = ReadControlValue(1)
 sValue = listboxValues(nItem) 
 print "Deleting " & nItem & " = " & sValue
 '**Update the record in the query (and so in the base table)
 Delete From lstValues 
 Where ROWID = arrRecordRowIDs(nItem)
 '**Refresh the list in the dialog
 Call AlterMainDialog
End Sub

You might want to add a Ask() function to ask the user if he really want to delete the record. Also you need to add a button to the dialog that will call this procedure

answered May 19, 2015 at 6:26
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.