In the classic Cold War thriller, Firefox, Vietnam veteran Mitchell Gant has to steal the top-secret Soviet Union, titular plane. Among its advanced features is that the systems are controlled by thought. But only if he thinks in Russian. This becomes a key plot factor in the climax of the film.
In my last post ; I remarked how many bad solutions I had found to sorting a SQLDataconnection Gridview. Well I’m happy to say I solved my problem last night. (And as an aside, I will not be posting the solution at this time because while the solution itself is decent, I’m not sure the code is the best.) Part of my solution was solved by “thinking in Russian”.
As I had mentioned, some of the so-called solutions to this problem that I had found on-line were pretty bad. In one case the author apparently decided the easiest solution was to decipher the viewstate, extract out the information, sort it and stuff it back into the viewstate. Now, as I’m writing this, I realize one advantage this has is that it removes a roundtrip from the web server to the database server. But that’s about it.
I also saw a solution that involved passing the column name back to the code-behind and having that decide which of multiple stored procs to call. I can’t say I favored this approach since it basically means a lot more maintenance if you ever say want to add a column to your Gridview (which turns out I decided afterwards I may want to do.)
Even worse, I’ve seen people propose things like building the select string on the fly and I can’t even begin to say how bad of an idea that is.
That said, the more I thought about it, the more I realized what the “right” solution was. Rather than fighting the system, I had to think like the system.
So, after a side trip down to trying to use SqlDataAdapter, I went back to my first approach of using a SqlDataReader. However, based on one example I saw, I decided to move this to a function of its own. This, if nothing else resulted in cleaner code (since I was already calling the SQLDataReader in two places (see Rule of Three). Once I did this, it was a little matter of figuring out how to bind the SqlDataReader to a Datatable and returning that.
Then I could bind the datatable directly to the GridView if I wanted to (which I do on the original Page_Load and Click_Submit OR I could in the _Sorting event bind it to a local Datatable, sort that and then bind the resulting sorted Datatable to my Gridview.
Worked like a charm. Well except for one little detail. And this one I’m still not sure if it is a MSFT bug that lives on for backwards compatibility or I and MANY other developers are doing something wrong, but the GirdView incorrectly will always return “descending” for its sort direction.
So in this case the common (still not convinced it’s the RIGHT or BEST solution) is to stuff a variable in the Viewstate and read that back every time sorting is called and reverse it as needed.
Once I did that, I had working code that could sort my Gridview on the selected column that was clean, easily reproducible and made sense.
I’ve found with my forays into .NET Framework and VB programming that if my initial approach appears overly complicated or just plan wrong, it probably is. So far in pretty much all cases, I’ve found that if I stop and try to “think in Russian” the solution will appear to me and is generally fairly straightforward and looks right.
Years ago when I studied Latin, I reached the point where I could read Latin natively. I loved it. But part of the switch is being able to think in the structure of the language. Not all languages use “SVO” (Subject-Verb-Object) order like English. Latin, “SOV” (Subject-Object-Verb) order uses. It takes some getting used to. But once you accept it, things get easier.
So I can’t fly a Mach 6 stealth aircraft, nor do I speak Russian, but I’m starting to think in VB. (Or is that I’m in VB starting to think?)