Greetings,
I have a nagging problem with client-side dynamic dependent list boxes that perhaps someone can help me troubleshoot.
I have a form with a series of dynamic dependent list boxes. Making a selection from list/box A (Qtr) selects a fiscal quarter, which then refreshes the values in list/box B (Mth), which shows the 3 months in that fiscal quarter, which then refreshes the values in list/box C (MthDate), which returns the date values for that month (e.g., 1-30).
My problem is that making the selection from list A correctly refreshes the values in list B but not with list C. Only when I physically change the option value in list B does list C refresh, but I would expect the list C values to refresh automatically when the onChange event fires upon making a selection in list A.
Here's the JavaScript code:
- <!-- Dynamic Dependent List box Code for *** VBScript *** Server Model //--><script language="JavaScript"><!--
-
var arrDynaList2 = new Array();
-
var arrDL2 = new Array();
-
arrDL2[1] = "Qtr"; // Name of parent list box
-
arrDL2[2] = "form1"; // Name of form containing parent list box
-
arrDL2[3] = "Mth"; // Name of child list box
-
arrDL2[4] = "form1"; // Name of form containing child list box
-
arrDL2[5] = arrDynaList2;
-
<%
-
Dim txtDynaListRelation2, txtDynaListLabel2, txtDynaListValue2, oDynaListRS2
-
txtDynaListRelation2 = "Qtr" ' Name of recordset field relating to parent
-
txtDynaListLabel2 = "Mth_Label" ' Name of recordset field for child Item Label
-
txtDynaListValue2 = "Mth" ' Name of recordset field for child Value
-
Set oDynaListRS2 = QtrMth ' Name of child list box recordset
-
Dim varDynaList2
-
varDynaList2 = -1
-
Dim varMaxWidth2
-
varMaxWidth2 = "1"
-
Dim varCheckGroup2
-
varCheckGroup2 = oDynaListRS2.Fields.Item(txtDynaListRelation2).Value
-
Dim varCheckLength2
-
varCheckLength2 = 0
-
Dim varMaxLength2
-
varMaxLength2 = 0
-
While (NOT oDynaListRS2.EOF)
-
If (varCheckGroup2 <> oDynaListRS2.Fields.Item(txtDynaListRelation2).Value) Then
-
If (varCheckLength2 > varMaxLength2) Then
-
varMaxLength2 = varCheckLength2
-
End If
-
varCheckLength2 = 0
-
End If
-
%>
-
arrDynaList2[<%=(varDynaList2+1)%>] = "<%=(oDynaListRS2.Fields.Item(txtDynaListRelation2).Value)%>"
-
arrDynaList2[<%=(varDynaList2+2)%>] = "<%=(oDynaListRS2.Fields.Item(txtDynaListLabel2).Value)%>"
-
arrDynaList2[<%=(varDynaList2+3)%>] = "<%=(oDynaListRS2.Fields.Item(txtDynaListValue2).Value)%>"<%
-
If (len(oDynaListRS2.Fields.Item(txtDynaListLabel2).Value) > len(varMaxWidth2)) Then
-
varMaxWidth2 = oDynaListRS2.Fields.Item(txtDynaListLabel2).Value
-
End If
-
varCheckLength2 = varCheckLength2 + 1
-
varDynaList2 = varDynaList2 + 3
-
oDynaListRS2.MoveNext()
-
Wend
-
If (varCheckLength2 > varMaxLength2) Then
-
varMaxLength2 = varCheckLength2
-
End If
-
%>
-
-
var arrDynaList = new Array();
-
var arrDL1 = new Array();
-
arrDL1[1] = "Mth"; // Name of parent list box
-
arrDL1[2] = "form1"; // Name of form containing parent list box
-
arrDL1[3] = "Day"; // Name of child list box
-
arrDL1[4] = "form1"; // Name of form containing child list box
-
arrDL1[5] = arrDynaList;<%
-
Dim txtDynaListRelation, txtDynaListLabel, txtDynaListValue, oDynaListRS
-
txtDynaListRelation = "CategoryID" ' Name of recordset field relating to parent
-
txtDynaListLabel = "MthDate" ' Name of recordset field for child Item Label
-
txtDynaListValue = "MthDate" ' Name of recordset field for child Value
-
Set oDynaListRS = MthDate ' Name of child list box recordset
-
Dim varDynaList
-
varDynaList = -1
-
Dim varMaxWidth
-
varMaxWidth = "1"
-
Dim varCheckGroup
-
varCheckGroup = oDynaListRS.Fields.Item(txtDynaListRelation).Value
-
Dim varCheckLength
-
varCheckLength = 0
-
Dim varMaxLength
-
varMaxLength = 0
-
While (NOT oDynaListRS.EOF)
-
If (varCheckGroup <> oDynaListRS.Fields.Item(txtDynaListRelation).Value) Then
-
If (varCheckLength > varMaxLength) Then
-
varMaxLength = varCheckLength
-
End If
-
varCheckLength = 0
-
End If
-
%>
-
arrDynaList[<%=(varDynaList+1)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListRelation).Value)%>"
-
arrDynaList[<%=(varDynaList+2)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListLabel).Value)%>"
-
arrDynaList[<%=(varDynaList+3)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListValue).Value)%>"<%
-
If (len(oDynaListRS.Fields.Item(txtDynaListLabel).Value) > len(varMaxWidth)) Then
-
varMaxWidth = oDynaListRS.Fields.Item(txtDynaListLabel).Value
-
End If
-
varCheckLength = varCheckLength + 1
-
varDynaList = varDynaList + 3
-
oDynaListRS.MoveNext()
-
Wend
-
If (varCheckLength > varMaxLength) Then
-
varMaxLength = varCheckLength
-
End If
-
%>
-
-
//--></script><!-- End of object/array definitions, beginning of generic functions --><script language="JavaScript">
-
<!--
-
function setDynaList(arrDL){
-
var oList1 = document.forms[arrDL[2]].elements[arrDL[1]];
-
var oList2 = document.forms[arrDL[4]].elements[arrDL[3]];
-
var arrList = arrDL[5];
-
clearDynaList(oList2);
-
if (oList1.selectedIndex == -1){
-
oList1.selectedIndex = 0;
-
}
-
populateDynaList(oList2, oList1[oList1.selectedIndex].value, arrList);
-
return true;
-
}
-
function clearDynaList(oList){
-
for (var i = oList.options.length; i >= 0; i--){
-
oList.options[i] = null;
-
}
-
oList.selectedIndex = -1;
-
}
-
function populateDynaList(oList, nIndex, aArray){
-
for (var i = 0; i < aArray.length; i= i + 3){
-
if (aArray[i] == nIndex){
-
oList.options[oList.options.length] = new Option(aArray[i + 1], aArray[i + 2]);
-
}
-
}
-
if (oList.options.length == 0){
-
oList.options[oList.options.length] = new Option("Please Select",0);
-
}
-
oList.selectedIndex = 0;
-
}
-
function MM_callJS(jsStr) { //v2.0
-
return eval(jsStr)
-
}
-
//-->
-
//--></script>
Here also is the body onload code...
- <body onload="MM_callJS('setDynaList(arrDL2)');MM_callJS('setDynaList(arrDL1)')">
...and the list/menu on change codes...
- <select name="Qtr" onchange="MM_callJS('setDynaList(arrDL2)')">
- <select name="Mth" id="Mth" onchange="MM_callJS('setDynaList(arrDL1)')">
Whatever help someone can offer would be greatly appreciated.
Regards,
j