First off, asp.net webforms are designed to only use one form per page. You should consider using a control like a repeater to render your your controls within the same form.
Anyhow. If you are looking (using a breakpoint and a quick watch) at your Request variables you should be able to find the hidden field. But its not named "fest_id", it got another name containing the page and control name and a bunch of other characters. This is the default way for all asp.net controls (like asp:HiddenField).
You may force asp.net to give the control your id if you are using asp.net 4.0 by setting ClientIDMode to Static:
<asp:HiddenField ID="fest_id" runat="server" ClientIDMode="Static" />
Or you may use the standard html hidden control to get the correct id but you cannot use code behind to set the value in this case:
<input type="hidden" name="fest_id" id="fest_id">
You should consider if a for loop in your aspx is the way to go. Its not the standard way to go in webforms. Take a look at the repeater or another control to render complex markup.