Using a single validation handler for all controllers in a form
Just a few random observations:


foreach (TextBox tb in this.Controls.OfType&lt;TextBox&gt;().Where(x =&gt; x.CausesValidation == true))



tb is a bad name; without the explicit TextBox type one would have to read the entire part after the in, to figure out that we're talking about a TextBox. And it's not uncommon for loops to use implicit types, like this:

foreach (var tb in this.Controls.OfType&lt;TextBox&gt;().Where(x =&gt; x.CausesValidation == true))


Now in this part:


.Where(x =&gt; x.CausesValidation == true)



You're comparing a bool to true - that's a no-no. Write it like this instead:

.Where(x =&gt; x.CausesValidation)


It's probably also more readable to iterate over an identifier instead of an expression; I'd split it like this:

var textBoxes = Controls.OfType&lt;TextBox&gt;()
                        .Where(textBox =&gt; textBox.CausesValidation);

foreach (var textBox in textBoxes)
{
    // ...
}




Kudos for IsNullOrWhiteSpace:


if (string.IsNullOrWhiteSpace(currenttb.Text))



However, currenttb should be camelCase, and would be more readable as currentTextBox.



Careful with extra spaces:


string.Format("Empty field {0 }"



I don't think this is legal, should be "Empty field {0}".