I concur with Seb.
If you set DEFAULTVIEW=YES and experiment with and without ROWBOUND it may be a little clearer what is happening. By looking in the action panel you can see when the action is active.
DISPLAY ARRAY arr TO scr.* ATTRIBUTES(DOUBLECLICK=foo)
ON ACTION foo ATTRIBUTES(DEFAULTVIEW=YES)#, ROWBOUND)
MESSAGE "Doube click, row=", arr_curr()
END DISPLAY
You'll see that without ROWBOUND, the action is still active when there are no rows. With ROWBOUND, the action is not active when there are no rows.