MDI does not in fact support hiding child windows. Winforms has a workaround for that, it will destroy the native window when you set its Visible property to false (or call Hide()) and recreate the window when you make it visible again.
Unfortunately there's a bug that bytes in your case. Destroying the native window will also make it disappear from the Application.OpenForms() collection. You depend on that collection to find the window back, it is not going to work and you'll always create a new instance of the form. Which of course doesn't have any text in that TextBox. Easy to see with the debugger btw.
So you cannot use the OpenForms collection. You can however use the MdiChildren collection to find it back. So rewrite it to:
bool found = false;
foreach (Form childForm in parent.MdiChildren) {
if (form.GetType() = typeof(T)) form.Visible = found = true;
else form.Visible = false;
}
if (!found) {
// etc...
}