Basically runat=server determines if the control is visible through codebehind or not. Html controls can have runat=server.
<input type="text" runat="server" id="txtbox" />
Now you can refer to the control using txtbox in the codebehind. Asp.NET actually builds a class in the server by parsing the html you write in design. It puts all the controls that are declared as runat=server as class members, and also places the other controls (which are actually not declared as runat=server) as internal properties.
During the rendering of the page, it writes the response taking all the controls(both).
Now the question is when you need to use Runat=server. If you are using runat=server it actually places the value of the whole control in viewstate to maintain the pagestate, which is actually absent for others.
So runat server control increases the page size by writing elements in viewstate.
So if you dont need to update a control from the server side, you shouldnt be using the runat=server to that control.
Provided, you can easily get the value of a control which is not declared as runat=server using
I hope it is clear now. Sunitajadhav, if this helps please login to Mark As Answer. | Alert Moderator