It surely works, but it's terrible advice to use triggerClientEvent inside a loop for no reason. I mean, why can't you just send the whole table over and loop through it there?
-- server
function sendRowsToClient()
local result = dbPoll(dbQuery( connection, "SELECT * FROM `VList`", -1))
if result and #result > 0 then
triggerClientEvent(source, "SendRows", source, result)
end
end
-- client --
addEvent("SendRows", true)
addEventHandler("SendRows", root,
function(tableData)
local data = tableData
for k, v in ipairs(data) do
local row = guiGridListAddRow ( PlayerVehicleList )
guiGridListSetItemText ( PlayerVehicleList, row, 1, v["id"], false, false )
guiGridListSetItemText ( PlayerVehicleList, row, 2, v["name"], false, false )
guiGridListSetItemText ( PlayerVehicleList, row, 3, v["price"], false, false )
end
end)