Very nice question.
I wouldn't call it a bug. We need to understand what really is happening under the hood.
When you set Display="Dynamic" , the Validator controls style property is actually set as "display:none" and hence, it does not retain any space when the validator is now shown.
If you use firebug, you will see that, the Validator control will render the following HTML:
<span style="color: Red; display: none;" id="RequiredFieldValidator1">RequiredFieldValidator</span>
And, when you set Display="Static", the Validator control's style property is actually set as "visibility:hidden", which actually retains space in the UI when the validator is not shown.
If you use firebug, you will see that, the Validator control will now render the following HTML:
<span style="color: Red; visibility: hidden;" id="RequiredFieldValidator1">RequiredFieldValidator</span>
Now, let me explain what happens when the Display="Dynamic" is set.
--You browse the page and click the button without placing any text in the text box. The validation error message is being shown.
--You put some text in the text box and tries to click the button. This results in the "onmouseout" javascript event firing on the text box control (Before firing the "onclick" event on the button), which results in the validator to validate the text box again, no error is found and the validator control's style property is set to "display:none".
--This causes the validator control's corresponding HTML element (span) to give up it's space in the UI and hence the whole UI is repainted in the browser. So, the button finds it's new place and occupies the space that was retained by the validator control's space (span).
--The while UI is repainted before your click event is executed on the button. So, in reality, your click event on the browser is not executed at all. So, nothing happens and you need to click again on the button.
To verify the above explanation, you can do a quick test as follows:
--Refresh the browser again.
--Click the button without placing any text in the text box. The validation error message will be shown.
--Write some text in the text box and click on any where on the browser (not on the button).
--This will cause the "onmouseout" event of the text box, validator will be fired, the error message will be gone, and the button will replace the validation message's place. Same result.
So, its not actually a bug. Rather, its just that we have to understand what happens under the hood when we are setting Display="Dynamic" and this we need to adjust our codes/implementation accordingly.
Hope, this will help.