Forget the "runat" attribute, that doesn't work on controls created this way which are effectively basic html controls. Second you need a unique name for the element, might as well make it the same as the id
sb.Append("<textarea id=txt_comments" & i & "
name='txt_comments" & i & "' rows='5' cols='60'></textarea></td>")
In your code-behind you can read the value from the Request.Form collection based on the name
Request.Form("txt_comments1")
The alternative would be to actually create server-side controls like a TextBox and add it to the page's Controlls collection. If you google "asp.net create dynamic controls" you'll find lots of examples of how to do that.