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