Yes. If the columns are always the same, you can set them up in the Window Designer’s Column Headers editor, or directly in code:
p_listbox.ColumnCount = 3
p_listbox.HasHeaders = True
p_listbox.SetHeaderText(0, "Reference")
p_listbox.SetHeaderText(1, "Name")
p_listbox.SetHeaderText(2, "Date")
That gives you an empty ListBox with headings, without running a database query. You can load the records later when needed.
If the columns change depending on the SQL, you can read the column names from the empty RecordSet returned by your existing LIMIT 0 query:
p_listbox.ColumnCount = rs.ColumnCount
p_listbox.HasHeaders = True
For i As Integer = 0 To rs.ColumnCount - 1
p_listbox.SetHeaderText(i, rs.ColumnName(i))
Next
rs.Close()
Here, rs is the result of your query. You do not need to call MoveToNextRow() to read those column names.
Could you post the SQL statement, which database you are using, and roughly how long the headings take to appear? I’d like to check where that delay is coming from before recommending a different query.