The reason that you don't understand is because it can't be done. You can only report progress that you can measure. If you call Fill on a data adapter then you have no way to measure how far along the task is so you can't report it to the user. Generally, in such situations, you simply set the Style of the ProgresBar to Marquee, to indicate to the user that something is happening but that you don't know how far along it is. You still need to do the data access on a secondary thread though, or the ProgressBar won't animate.
There is one option if you're retrieving data where you can perform the same query twice with the first time getting just the count of the results and then the second time getting the data using a data reader. You then know after reading each record how many have been read and how many there are still to read. The problem with that is that it's more laborious to code but, more importantly, you actually make the whole thing take longer, especially for complex queries.
When you're saving data you also loop through the records and save them one by one, again allowing you to measure you current progress. Again though, you will make the whole process slower by doing so.