注册 登录
编程论坛 ASP技术论坛

网上下的下拉联动插件!数据库是写在XML文本文件里的。如何实现这样的功能?

lxb0592 发布于 2012-11-13 20:46, 1116 次点击
代码如下!
程序代码:
多级联动下拉选择框,动态获取下一级,每一级数据为XML,可支持无限级(浏览器端需要Microsoft.XMLDOM支持)</p>
<select name="MaterialClass1" ChildSelectName="MaterialClass2"></select>
<select name="MaterialClass2" ChildSelectName="MaterialClass3"></select>
<select name="MaterialClass3"></select>
添加数据时的页面:
只有本站会员才能查看附件,请 登录


但是在需要对已有的数据修改时!所属工区一直是默认最上面的鹰潭。如何修改代码使工区栏默认为这条数据本身的工区?
只有本站会员才能查看附件,请 登录


这是所属工区的XML数据库文件(不在系统MDB数据库里,单独的一个.XML文本文件里)
<MaterialClasses>
        <MaterialClass MaterialClassCode="01" Description="鹰潭"/>
        <MaterialClass MaterialClassCode="02" Description="上饶"/>
        <MaterialClass MaterialClassCode="03" Description="景德镇"/>
        <MaterialClass MaterialClassCode="04" Description="向西一"/>
        <MaterialClass MaterialClassCode="05" Description="向西二"/>
        <MaterialClass MaterialClassCode="06" Description="萍乡"/>
        <MaterialClass MaterialClassCode="07" Description="新余"/>
        <MaterialClass MaterialClassCode="08" Description="九江"/>
        <MaterialClass MaterialClassCode="09" Description="吉安"/>
        <MaterialClass MaterialClassCode="10" Description="赣州"/>
        <MaterialClass MaterialClassCode="11" Description="向西电脱"/>
        <MaterialClass MaterialClassCode="12" Description="鹰潭综合"/>
        
    </MaterialClasses>
23 回复
#2
lxb05922012-11-14 16:33
这个是添加数据时的SCRIPT代码,应该是加载XML数据库作用,那么在修改数据时这段代码做和修改啊?
程序代码:
<script>
var m_oXMLDoc = [color=#0000FF]new
ActiveXObject("Microsoft.XMLDOM");
var m_sXmlSrc = "MaterialClass.xml";
//-----------------------------------------------
// LoadXML(strXMLSrc)
//-----------------------------------------------

function BindSelect( strXMLSrc , objSelectName)
{
    m_oXMLDoc.async = true;
    m_oXMLDoc.onreadystatechange = Function( "fnLoadComplete('" + objSelectName + "');" );   
    m_oXMLDoc.load( strXMLSrc );
}

function fnLoadComplete(objSelectName)
{
    var objSelect = document.all[objSelectName];
    var aryXMLNodes;
    var node;
    if (objSelect == null)
        return;
    try
    {
        var iReadyState = m_oXMLDoc.readyState;
    }
    catch(e)
    {
        return;
    }
   
    if(  iReadyState != 4 ) return;
   
    if( m_oXMLDoc != null && m_oXMLDoc.xml != "" )
    {
        objSelect.length = 0;
        aryXMLNodes = m_oXMLDoc.documentElement.selectNodes("MaterialClass");
        for (var i=0; i < aryXMLNodes.length; i++)
        {
            node = aryXMLNodes[i];
            objSelect.options[i] = new Option(node.getAttribute("Description"),node.getAttribute("MaterialClassCode"));
        }
      
        if(objSelect.ChildSelectName != null)
        {
            objSelect.onchange = Function( "BindSelect('MaterialClass'+this.options[this.selectedIndex].value+'.xml', '"+objSelect.ChildSelectName+"');" );   
            objSelect.fireEvent("onchange");
           
        }
    }
}

function Init()
{
    try{
        BindSelect( m_sXmlSrc, "MaterialClass1");
    }
    catch(e)
    {
        setTimeout("Init()",1000)
    }
}


</script>

<body onLoad="Init()">
<p>多级联动下拉选择框,动态获取下一级,每一级数据为XML,可支持无限级(浏览器端需要Microsoft.XMLDOM支持)</p>
<select name="MaterialClass1" ChildSelectName="MaterialClass2"></select>
<select name="MaterialClass2" ChildSelectName="MaterialClass3"></select>
<select name="MaterialClass3"></select>
[/color]我曾尝试加了<select name="MaterialClass1" ChildSelectName="MaterialClass2"><option value="<%=rs("card")%></option></select>
<%=rs("card")%是这条数据本身的值。但没成功。应该还是要修改SCRIPT代码吧!


[ 本帖最后由 lxb0592 于 2012-11-14 16:34 编辑 ]
#3
cnfarer2012-11-14 20:43
这些代码只是将XML绑定到select上去,并没涉及选中项的设置.当第一级改变时,怎么知道你在二级上要选择哪一项啊,当然是默认第一项啦.


[ 本帖最后由 cnfarer 于 2012-11-14 20:44 编辑 ]
#4
dzt00012012-11-14 21:25
function BindSelect( strXMLSrc , objSelectName , selectedValue)
{
    m_oXMLDoc.async = true;
    m_oXMLDoc.onreadystatechange = Function( "fnLoadComplete('" + objSelectName + "', '" + selecetdValue + "');" );   
    m_oXMLDoc.load( strXMLSrc );
}

....
function fnLoadComplete(objSelectName, selectedValue)
.....
objSelect.options[i] = new Option(node .....    这句后面加下面蓝色代码
if (selectedValue) {
    if (objSelect.options[i].value==selectedValue)  objSelect.selectedIndex =i;
}


没有试验过,自己尝试吧
#5
lxb05922012-11-14 21:42
回复 4楼 dzt0001
试试看! 谢谢啊!
#6
lxb05922012-11-15 10:44
回复 4楼 dzt0001
朋友在调用代码改怎么修改?
<select name="MaterialClass1" ChildSelectName="MaterialClass2"></select>
我在<select name="MaterialClass1" selectedValue="05" ChildSelectName="MaterialClass2"></select>
好像05的那个工区还是显示不来。还是默认第一个。
这里该怎么改?
#7
dzt00012012-11-15 11:26
回复 6楼 lxb0592
在自定义的Init()函数中
BindSelect( m_sXmlSrc, "MaterialClass1", "<%=数据库保存的值%>");
#8
lxb05922012-11-15 17:41
回复 7楼 dzt0001
大哥非常感谢您! 在您指导下,解决了这个问题!(这个下拉联动插件非常实用,如果因为这个问题而放弃可惜)
BindSelect( m_sXmlSrc, "MaterialClass1", "<%=数据库保存的值%>");
在Init()函数你提示的位置,我加入数据库保存的值的代码,就解决了。再次感谢您! 非常激动。
#9
lxb05922012-11-15 17:44
感谢 dzt0001高手朋友!在他指导下! 解决的了这个问题。
#10
lxb05922012-11-15 22:18
回复 7楼 dzt0001
晕死!忘了还有个第二级子下拉框也要把原来的数据传递过来。也没搞出来!兄弟再麻烦您一下,该怎么再改下?是还要修改前面的SCRIP代码?还是对下面的调用代码修改?

<select name="MaterialClass1" ChildSelectName="MaterialClass2"></select>
<select name="MaterialClass2" ChildSelectName="MaterialClass3"></select>
<select name="MaterialClass3"></select>
中间红色是第二级的调用下拉框。


下面是第二级的一个XML数据库文本文件
<?xml version="1.0" encoding="GB2312"?>
    <MaterialClasses>
        <MaterialClass MaterialClassCode="22" Description="鹰西THDS/TFDS/AEI"/>
        <MaterialClass MaterialClassCode="23" Description="贵溪上下行THDS"/>
        <MaterialClass MaterialClassCode="24" Description="弋阳东上下行THDS"/>
        
     </MaterialClasses>
#11
lxb05922012-11-15 22:21
回复 7楼 dzt0001
BindSelect( m_sXmlSrc, "MaterialClass1", "<%=数据库保存的值%>");
SCRIPT代码中,好像没有对第二级下拉框类似 BindSelect( m_sXmlSrc, "MaterialClass2", "<%=数据库保存的值%>");这样的代码
#12
dzt00012012-11-16 11:31
回复 11楼 lxb0592
看代码似乎只对第一级进行了加载,后面的需要上一级手动触发。
#13
lxb05922012-11-16 11:51
回复 12楼 dzt0001
哦!那能在SCRIPT代码中增加这一级下拉框的触发代码吗?
或者能在调用代码的(中间红色)做修改实现数据库值传递过来不?
select name="MaterialClass1" ChildSelectName="MaterialClass2"></select>
<select name="MaterialClass2" ChildSelectName="MaterialClass3"></select>
<select name="MaterialClass3"></select>
小弟麻烦您了!
#14
dzt00012012-11-16 12:05
试试看这样行不行 还是在Init()中改
BindSelect( m_sXmlSrc, "MaterialClass1", "<%=第一级的值%>");
BindSelect( 'MaterialClass<%=第一级的值%>.xml', "MaterialClass2", "<%=第二级的值%>");

#15
lxb05922012-11-17 00:32
回复 14楼 dzt0001
不行!修改后,下拉框的数据值一直闪动!要的效果出不来!
#16
lxb05922012-11-17 00:46
回复 14楼 dzt0001
我试了下!增加红色代码后,修改页面的2个下拉框值都在闪动。
function Init()
{
    try{
       BindSelect( m_sXmlSrc, "MaterialClass1", "<%=rs("card")%>");
        BindSelect( 'MaterialClass<%=rs("card")%>.xml', "MaterialClass2", "<%=rs("username")%>");
        }
  
但是如果增加红色代码的同时把第一级母代码页删除2级的值能传递过来,但同时1级的下拉框就没值了,空的了。
function Init()
{
    try{
        BindSelect( 'MaterialClass<%=rs("card")%>.xml', "MaterialClass2", "<%=rs("username")%>");
        }
应该说效果是实现了。就是该怎么解决一级二级同时使用的时候,解决下拉框里面的值闪动问题。这2条代码是不是不能放在一起?该怎么解决?

[ 本帖最后由 lxb0592 于 2012-11-17 00:47 编辑 ]
#17
dzt00012012-11-17 12:28
可能是try..catch(e)...setTimeout 在作怪,将init()下直接写下面两行代码看看
BindSelect( m_sXmlSrc, "MaterialClass1", "<%=rs("card")%>");
BindSelect( 'MaterialClass<%=rs("card")%>.xml', "MaterialClass2", "<%=rs("username")%>");

因为代码不全,我测试不方便,你自己试吧

[ 本帖最后由 dzt0001 于 2012-11-17 12:46 编辑 ]
#18
lxb05922012-11-17 13:45
回复 17楼 dzt0001
好的!谢谢!麻烦了
#19
lxb05922012-11-17 14:12
回复 17楼 dzt0001
测试了下!把try..catch(e)...setTimeout 删除。在init()下直接写下面两行代码。
BindSelect( m_sXmlSrc, "MaterialClass1", "<%=rs("card")%>");
BindSelect( 'MaterialClass<%=rs("card")%>.xml', "MaterialClass1", ", "<%=rs("username")%>");

虽然解决了闪动问题。
但只有母下拉框"MaterialClass1"的值传递过来。子下拉框"MaterialClass2", 的值还是没传递过来。仍然默认最上面的一个值。
#20
dzt00012012-11-17 15:01
第二行应该是MaterialClass2吧
#21
lxb05922012-11-17 16:47
回复 20楼 dzt0001
代码里面是写的MaterialClass2,还是没值传递过来!
#22
dzt00012012-11-18 11:11
m_oXMLDoc.async = false;  

另外说一句,XML的MaterialClassCode层级对应关系要正确。
#23
lxb05922012-11-18 12:54
回复 22楼 dzt0001
哈哈!确实现在能成功了! 非常感谢啊!
#24
lxb05922012-11-18 12:55
真不容易!
1