By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,165 Members | 894 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,165 IT Pros & Developers. It's quick & easy.

Troubleshooting client-side dynamic dependent list boxes

P: 87
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:

Expand|Select|Wrap|Line Numbers
  1. <!-- Dynamic Dependent List box Code for *** VBScript *** Server Model //--><script language="JavaScript"><!--
  2. var arrDynaList2 = new Array();
  3. var arrDL2 = new Array();
  4. arrDL2[1] = "Qtr";           // Name of parent list box
  5. arrDL2[2] = "form1";                  // Name of form containing parent list box
  6. arrDL2[3] = "Mth";         // Name of child list box
  7. arrDL2[4] = "form1";                  // Name of form containing child list box
  8. arrDL2[5] = arrDynaList2;
  9. <%
  10. Dim txtDynaListRelation2, txtDynaListLabel2, txtDynaListValue2, oDynaListRS2
  11. txtDynaListRelation2 = "Qtr"    ' Name of recordset field relating to parent
  12. txtDynaListLabel2 = "Mth_Label"    ' Name of recordset field for child Item Label
  13. txtDynaListValue2 = "Mth"        ' Name of recordset field for child Value
  14. Set oDynaListRS2 = QtrMth         ' Name of child list box recordset
  15. Dim varDynaList2
  16. varDynaList2 = -1
  17. Dim varMaxWidth2
  18. varMaxWidth2 = "1"
  19. Dim varCheckGroup2
  20. varCheckGroup2 = oDynaListRS2.Fields.Item(txtDynaListRelation2).Value
  21. Dim varCheckLength2
  22. varCheckLength2 = 0
  23. Dim varMaxLength2
  24. varMaxLength2 = 0
  25. While (NOT oDynaListRS2.EOF)
  26.  If (varCheckGroup2 <> oDynaListRS2.Fields.Item(txtDynaListRelation2).Value) Then
  27.   If (varCheckLength2 > varMaxLength2) Then
  28.    varMaxLength2 = varCheckLength2
  29.   End If
  30.   varCheckLength2 = 0
  31.  End If
  32. %>
  33.  arrDynaList2[<%=(varDynaList2+1)%>] = "<%=(oDynaListRS2.Fields.Item(txtDynaListRelation2).Value)%>"
  34.  arrDynaList2[<%=(varDynaList2+2)%>] = "<%=(oDynaListRS2.Fields.Item(txtDynaListLabel2).Value)%>"
  35.  arrDynaList2[<%=(varDynaList2+3)%>] = "<%=(oDynaListRS2.Fields.Item(txtDynaListValue2).Value)%>"<%
  36.  If (len(oDynaListRS2.Fields.Item(txtDynaListLabel2).Value) > len(varMaxWidth2)) Then
  37.   varMaxWidth2 = oDynaListRS2.Fields.Item(txtDynaListLabel2).Value
  38.  End If
  39.  varCheckLength2 = varCheckLength2 + 1
  40.  varDynaList2 = varDynaList2 + 3
  41.  oDynaListRS2.MoveNext()
  42. Wend
  43. If (varCheckLength2 > varMaxLength2) Then
  44.  varMaxLength2 = varCheckLength2
  45. End If
  46. %>
  47.  
  48. var arrDynaList = new Array();
  49. var arrDL1 = new Array();
  50. arrDL1[1] = "Mth";         // Name of parent list box
  51. arrDL1[2] = "form1";                  // Name of form containing parent list box
  52. arrDL1[3] = "Day";         // Name of child list box
  53. arrDL1[4] = "form1";                  // Name of form containing child list box
  54. arrDL1[5] = arrDynaList;<%
  55. Dim txtDynaListRelation, txtDynaListLabel, txtDynaListValue, oDynaListRS
  56. txtDynaListRelation = "CategoryID"    ' Name of recordset field relating to parent
  57. txtDynaListLabel = "MthDate"     ' Name of recordset field for child Item Label
  58. txtDynaListValue = "MthDate"        ' Name of recordset field for child Value
  59. Set oDynaListRS = MthDate         ' Name of child list box recordset
  60. Dim varDynaList
  61. varDynaList = -1
  62. Dim varMaxWidth
  63. varMaxWidth = "1"
  64. Dim varCheckGroup
  65. varCheckGroup = oDynaListRS.Fields.Item(txtDynaListRelation).Value
  66. Dim varCheckLength
  67. varCheckLength = 0
  68. Dim varMaxLength
  69. varMaxLength = 0
  70. While (NOT oDynaListRS.EOF)
  71.  If (varCheckGroup <> oDynaListRS.Fields.Item(txtDynaListRelation).Value) Then
  72.   If (varCheckLength > varMaxLength) Then
  73.    varMaxLength = varCheckLength
  74.   End If
  75.   varCheckLength = 0
  76.  End If
  77. %>
  78.  arrDynaList[<%=(varDynaList+1)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListRelation).Value)%>"
  79.  arrDynaList[<%=(varDynaList+2)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListLabel).Value)%>"
  80.  arrDynaList[<%=(varDynaList+3)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListValue).Value)%>"<%
  81.  If (len(oDynaListRS.Fields.Item(txtDynaListLabel).Value) > len(varMaxWidth)) Then
  82.   varMaxWidth = oDynaListRS.Fields.Item(txtDynaListLabel).Value
  83.  End If
  84.  varCheckLength = varCheckLength + 1
  85.  varDynaList = varDynaList + 3
  86.  oDynaListRS.MoveNext()
  87. Wend
  88. If (varCheckLength > varMaxLength) Then
  89.  varMaxLength = varCheckLength
  90. End If
  91. %>
  92.  
  93. //--></script><!-- End of object/array definitions, beginning of generic functions --><script language="JavaScript">
  94. <!--
  95. function setDynaList(arrDL){
  96.  var oList1 = document.forms[arrDL[2]].elements[arrDL[1]];
  97.  var oList2 = document.forms[arrDL[4]].elements[arrDL[3]];
  98.  var arrList = arrDL[5];
  99.  clearDynaList(oList2);
  100.  if (oList1.selectedIndex == -1){
  101.   oList1.selectedIndex = 0;
  102.  }
  103.  populateDynaList(oList2, oList1[oList1.selectedIndex].value, arrList);
  104.  return true;
  105. }
  106. function clearDynaList(oList){
  107.  for (var i = oList.options.length; i >= 0; i--){
  108.   oList.options[i] = null;
  109.  }
  110.  oList.selectedIndex = -1;
  111. }
  112. function populateDynaList(oList, nIndex, aArray){
  113.  for (var i = 0; i < aArray.length; i= i + 3){
  114.   if (aArray[i] == nIndex){
  115.    oList.options[oList.options.length] = new Option(aArray[i + 1], aArray[i + 2]);
  116.   }
  117.  }
  118.  if (oList.options.length == 0){
  119.   oList.options[oList.options.length] = new Option("Please Select",0);
  120.  }
  121.  oList.selectedIndex = 0;
  122. }
  123. function MM_callJS(jsStr) { //v2.0
  124.   return eval(jsStr)
  125. }
  126. //-->
  127. //--></script>
Here also is the body onload code...

Expand|Select|Wrap|Line Numbers
  1. <body onload="MM_callJS('setDynaList(arrDL2)');MM_callJS('setDynaList(arrDL1)')">
...and the list/menu on change codes...

Expand|Select|Wrap|Line Numbers
  1. <select name="Qtr" onchange="MM_callJS('setDynaList(arrDL2)')">
Expand|Select|Wrap|Line Numbers
  1. <select name="Mth" id="Mth" onchange="MM_callJS('setDynaList(arrDL1)')">
Whatever help someone can offer would be greatly appreciated.

Regards,

j
May 21 '09 #1
Share this Question
Share on Google+
1 Reply


P: 87
PROBLEM RESOLVED. I figured out what the problem was. I'd omitted on onChange event in list A for list C. It now works as designed
May 21 '09 #2

Post your reply

Sign in to post your reply or Sign up for a free account.