Your ValidateText will set the Successful to indicate if the last entry in the textbox list is valid or not. All the checking of the earlier entries is lost.
Try something like:
publicvoid ValidateText(List<TextBox> textboxes)
Successful = true; // Assume all are valid until shown otherwise
foreach (var tb in textboxes)
if (string.IsNullOrEmpty(tb.Text)) // could also use .IsNullOrWhiteSpace()
Successful = false; // this means that at least 1 is failing.
// collect the failing ones here
List<TextBox> textboxes = new List<TextBox>();
FormValidation validate = new FormValidation();
//more stuff that i did not paste in.
Personally, I'd probably make a validation method that operates on one string at a time and then validate and set the errorprovider directly for each TextBox one at a time. (Despite what I showed above, I wouldn't pass the actual TextBox references around. The method should validate the string, possibly returning an error message. The caller (form) passes the .Text and reports the error appropriately.)