The reason it's not working is this is what's happening:
1. First load of page, controls are not visible. Great.
2. On click, the controls are visible. Awesome.
3. On subsequent clicks, controls are still visible = true, as viewstate sent back to server on third click is visible=true, so you are not making any effective change to visibility.
Try this instead:
protected void link1_Click(object sender, EventArgs e)
{
placeHolder1.Visible = !placeHolder1.Visible;
textBox1.Visible = !textBox1.Visible;
}
UPDATED:
NOTE that the placeholder visibility OVERRIDES all controls visibility inside it.
Therefore, technically you only need to set PlaceHolder's Visible property True or False.
In order for this to work then, you must specify the placeholder default Visible value.