I’m a participant on a CMC called Lily It is based out of my alma mater, RPI. At some point, someone created a rule (which I’ve seen elsewhere so it’s hardly unique) that sometimes the fastest way to get the right answer to a question is to post the wrong answer.
There is truth to that. I think in part it can be summed up with this XKCD cartoon. Many of us who are involved in technology seem to have an incessant need to be “right”. So when we see something wrong, we’re compelled to correct the mistake.
But, to be wrong, it has to be clearly wrong. To go back to my cave rescue experience, if I recommend a 3:1 haul system and you recommend a 2:1, neither of us is necessarily wrong. We might be optimizing for different factors. On the other hand, if you recommend we use 11mm rope for the haul line and I whip out some clothesline I’ve had in my car for a few years and suggest it should be good enough, after all it’s only Bill we’re rescuing, I’m clearly going to be wrong and need to be corrected.
These thoughts about being wrong and trying to find the right answer were prompted by a coding problem that has consumed far too much of my time. I finally came up with an answer that worked, but not one that I liked.
Essentially I’m building a Combobox (loading it from a datatable) in vb.net
It has key,value pairs, let’s call them (“Test1”, “A”), (“Test2”, “B”) and so forth.
(note VB.net appears to call these a DisplayMember,ValueMember pair and they can be loaded with a dictionary type, so in my mind it’s what they call the “valuemember” is what I’d consider the lookup key and that illustrate my misunderstanding of the issue.)
However, once I load the record in question, I want the selected value in the dropdown to reflect the value in the record (which of course is stored as “A” or “B” etc.)
There appears to be no way in VB.Net to easily say something like:
cbxResource.SelectedValue = Itemrecord.Value
Then I tried:
cbxResource.SelectedItem = Itemrecord.Item just to see if it would work. It doesn’t.
Googling suggests something like:
cbxResource.SelectedIndex = cbxResource.FindString(Itemrecord.Item)
That does indeed work, if I know the DisplayMember name. But that’s I want to display, not what I store in Itemrecord and as such means I don’t know it.
It strangely seems I can not set the index based on the ValueMember, just the DisplayMember. To me this is strange since coming from a DB world, it appears the value member would be the key I’d want to look up to select the Displaymember to be displayed.
I finally settled on a hack. What if I switched the two?
cbxResources.DisplayMember = “Resource”
cbxResources.ValueMember = “Description”
cbxResources.SelectedIndex = cbxResources.FindStringExact(Itemrecord.Item)
cbxResources.DisplayMember = “Description”
cbxResources.ValueMember = “Resource”
I’m not sure I like this answer. It seems to me it should be far simpler. Or that I’m fundamentally misunderstanding how the control should be setup and used. But for now it’s the hack that’s going into my code.
So why publish here? Well either it’s a great work-around and I can save other folks the hours of fruitless searching I experienced, or someone can say, “It’s on the Internet and it’s wrong; I have to correct it!”
I’ll take either answer.
Moral: Sometimes being wrong is the right thing to do.