Q1: Disable is relatively easy:
foreach (Control c in Controls)
{
Button b = c as Button;
if (b != null)
{
b.Enabled = false;
}
}
If you use any containers such as Panels, you may want to put this in a method and use recursion through each control.Controls collection to get the buttons within them.
Q2: Don't! It is possible, but it is a very bad practice because it is against the principles of OOPs. When you access controls on a different form directly, you tie the design of the two forms together, so you can't change one without considering the effects on the other - this also makes it a lot harder to reuse your code which makes maintenance a PITA.
Instead, use a property on the target form which does the actual work, and change that from the other form. The complication comes if you want to change the value on a parent form, because you should not even know the parent exists! In that case, you should create an event in the child which the parent handles to say "new data available" and a property in the child which supplies the new string. The parent then gets the new text and sets it's own label.