Classes and their field, properties, methods, delegate, and events should not all be public: some of the information should be on a "need to know" basis only. Why? Well you drive a car with public information on it: Make, model, colour, registration number. That's all important, but it's not the only information: your name as the owner, your address, your driving licence status, conviction history are all available to law enforcement but aren't (except in Switzerland) accessible to the general public.
So if you cut someone up / off they have your public information - registration number, make, model, colour - so they can report the problem to the police, but they can;t turn up on your doorstep with a baseball bat.
Private information is internal to the class, it's what the class needs to know in order to work. generally speaking, all fields, all Controls, should be Private (or at least not Public)
Public information is what the rest of the world needs to know in order to use the class.
If you expose private information to the outside world, then that restricts what you can do with the class - because the outside world my use that private data to do something you didn't intend and your changes to the class may break external code: so you need to think very, very carefully before you can alter the way your class works internally.
Have qa look here: Understanding Access Modifiers in VB.NET | BinaryIntellect Knowledge Base