A user on cf-talk today asked if you could bind a drop down to an HTML grid. I tried it and got an error. The drop down expects a query or 2d array for it's source. Too bad. But - there is a solution. I blogged a few weeks ago about noting grid changes (Reacting to a grid row selection). This technique uses the CFAJAXPROXY tag to monitor the grid. In my previous blog entry, I just did an alert, but it's trivial to update a drop down as well. Consider the following example:
<cfajaxproxy bind="javascript:fixCat({entries.category})">
<script>
function fixCat(c) {
var dd = document.getElementById('mycat');
console.log(dd.options.length);
for(var i=0; i<dd.options.length;i++) {
if(dd.options[i].value==c) dd.selectedIndex=i;
}
}
</script>
<cfset q = queryNew("category,title")>
<cfloop index="x" from="1" to="10">
<cfset queryAddRow(q)>
<cfset rcat = listGetAt("Cat1,Cat2,Cat3", randRange(1,3))>
<cfset querySetCell(q,"category", rcat)>
<cfset querySetCell(q,"title", "Title #x#")>
</cfloop>
<cfform name="test">
<cfgrid autowidth="true" name="entries" format="html" query="q" width="600" bindOnLoad="true">
<cfgridcolumn name="category" display="true">
<cfgridcolumn name="title" header="Title">
</cfgrid>
<cfinput type="text" name="thetitle" bind="{entries.title}">
<cfselect name="mycat" id="mycat">
<option value="Cat1">Cat1
<option value="Cat2">Cat2
<option value="Cat3">Cat3
</cfselect>
</cfform>
So a good part of the code is my fake query and grid. You can pretty much ignore that. Note the first line uses cfajaxproxy with a bind attribute. This is what will fire and pass the proper column value to my function. I then just check the drop down option values and select it when I find a match.
In the grid - why did I have display="true"? Well normally this would be a hidden column, but I wanted to double check my work and ensure that the code was working. Not that I make mistakes of course.
Off Topic P.S.: Today I discovered "Apocalpso" by Mew. Dang what a good song. I've played it about 10 times now. Of course, every time I hear a really cool song - the first thing I want to do is try to play it in Guitar Hero II!