https://zoheirsoftware.com/blog/errorprovider-control-in-csharp