I always checked, yes, the values one-by-one. You can do that, or you can map every TextChanged
/SelectedIndexChanged
/etc. to event methods and set some bool
there to store that you know something has changed. But yeah, there's no really good or nice way I know of doing this. It's just kinda one of those tedious things that UIs require. At least as far as I know. I moved on, hesitantly for sure, from Windows Forms a while ago.
I'd personally be tempted, if I were writing something very seriously, to use the events approach. It just seems more prone to success, and you don't have to store the old values and compare them. Of course, it can be a little difficult to troubleshoot and debug, since the designer will be handling most of your code for you. So that has advantages and disadvantages to it. Given that, my one piece of advice should you elect to go the events route, register your events manually in the constructor and not the designer. I've just so many times seen the designer get confused after some change, or I forget to do something or not do something, and suddenly an event isn't linked and I don't test it for a while, then I'm confused when I do. Handling that aspect of the code yourself can be a good reminder, if nothing else. It might be a little messier, but I like to think of that as a good kind of mess, relatively speaking.
Note also, of course, that there's no need to have an event for each and every control of the same type. Keep it down to one and, if you need, check who the sender
is. But I wouldn't even do that unless you have to. Just flag your bool HasChanged
or whatever and look at that when you're looking for changes at the end.