求教关于三级联动组合下拉框
本帖最后由 flymouth 于 2010-8-16 15:13 编辑从论坛上看到一个帖子:http://www.autoitx.com/forum.php?mod=viewthread&tid=7475&highlight=%CF%C2%C0%AD,是关于级联下拉菜单的,但是想要一个三级联动的组合下拉框,求教:
问题如下:
有如下的一个对应关系:
济南市中大观园 3701001
济南市中经七路 3701002
济南市中六里山 3701003
济南市中七里山 3701004
济南市中二七村 3701005
济南市中玉函路 3701006
青岛市南金湖路 3702001
青岛市南中山路 3702002
青岛市南江苏路 3702003
青岛市南八大关 3702004
青岛市南八大湖 3702005
青岛市南湛山路 3702006
青岛市南八大峡 3702007
打算用三级联动菜单,来实现通过选择单位,让程序自动赋值单位和代码。
如第一级为:济南、青岛
第二级为第一级的下属单位:
如选择济南则为:市中、历下、天桥、槐荫
如选择青岛则为:市南、市北、李沧、城阳
第三级为第二级的下属单位:
如选择济南市中则为:大观园、经七路、六里山、七里山、二七新村、玉函路
如选择济南历下则为:大明湖、解放路、轻骑路、趵突泉、司里街
如选择青岛市南则为:金湖路、中山路、江苏路、八大关、八大湖、湛山路、八大峡
如选择青岛市北则为:登州路、冠县路、热河路、华阳路、延安路
第三级选择完成后,要得到两个变量一个是单位名称、另一个是单位代码,后面会用到。
求教如何实现以上想法,是否还有更便捷的办法,如把单位和对应代码作为配置文件,直接读取,应为大概有这样的几千个个单位要处理。 如果各级字符串数量一致就很好办 第三级是不一致的。前两级一致。 #include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 168, 104, 193, 125)
$Combo1 = GUICtrlCreateCombo("", 16, 8, 137, 25)
GUICtrlSetData(-1, "请选择...|奇瑞|江淮", "请选择...")
$Combo2 = GUICtrlCreateCombo("", 16, 39, 137, 25)
$Combo3 = GUICtrlCreateCombo("", 16, 70, 137, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Combo1
Switch GUICtrlRead($Combo1)
Case "奇瑞"
GUICtrlSetData($Combo2, "")
GUICtrlSetData($Combo2, "东方之子|奇瑞A1", "东方之子")
Case "江淮"
GUICtrlSetData($Combo2, "")
GUICtrlSetData($Combo2, "宾悦|同悦", "宾悦")
EndSwitch
Case $Combo2
Switch GUICtrlRead($Combo2)
Case "东方之子"
GUICtrlSetData($Combo3, "")
GUICtrlSetData($Combo3, "东方之子A色|东方之子B色", "东方之子A色")
Case "奇瑞A1"
GUICtrlSetData($Combo3, "")
GUICtrlSetData($Combo3, "奇瑞A1红色|奇瑞A1黑色", "奇瑞A1黑色")
Case "宾悦"
GUICtrlSetData($Combo3, "")
GUICtrlSetData($Combo3, "宾悦红色|宾悦黑色", "宾悦红色")
Case "同悦"
GUICtrlSetData($Combo3, "")
GUICtrlSetData($Combo3, "同悦红色|同悦黑色", "同悦黑色")
EndSwitch
EndSwitch
WEnd 谢谢,很感谢你的回复,这个我刚才试过,还有更简单的方法么?比如读取配置文件? LZ要的是不是这样.....#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1_1 = GUICreate("Form1", 564, 114, 192, 124)
$Combo1 = GUICtrlCreateCombo("选择地市", 24, 16, 153, 25)
$Combo2 = GUICtrlCreateCombo("选择区域", 200, 16, 153, 25)
$Combo3 = GUICtrlCreateCombo("具体路段", 376, 16, 153, 25)
$Label1 = GUICtrlCreateLabel("您选择的地址信息为", 24, 48, 156, 17)
$Label2 = GUICtrlCreateLabel("", 200, 48, 252, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Local $d1,$d2,$d3
$file = "地市选择.ini"
$c1 = ""
$var = IniReadSectionNames($file)
For $i = 1 To $var
$c1 = $c1 & $var[$i] & "|"
Next
GUICtrlSetData($Combo1, $c1)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Combo1
$c2 = ""
$d1 = GUICtrlRead($Combo1)
$var = IniReadSection($file, $d1)
For $i = 1 To $var
$c2 = $c2 & $var[$i] & "|"
Next
GUICtrlSetData($Combo2, "")
GUICtrlSetData($Combo2, $c2)
Case $Combo2
$c3 = ""
$d2 = GUICtrlRead($Combo2)
$c3 = IniRead($file, $d1, $d2, "")
GUICtrlSetData($Combo3, "")
GUICtrlSetData($Combo3, $c3)
Case $Combo3
$d3 = GUICtrlRead($Combo3)
GUICtrlSetData($Label2,$d1&","&$d2&","&$d3)
EndSwitch
WEnd
配套的"地市选择.ini"内容为:
[济南]
市中=大观园|经七路|六里山|七里山|二七新村|玉函路
历下=大明湖|解放路|轻骑路|趵突泉|司里街
[青岛]
市南=金湖路|中山路|江苏路|八大关|八大湖|湛山路|八大峡
市北=登州路|冠县路|热河路|华阳路|延安路 LZ 把文本
济南市中大观园 3701001
济南市中经七路 3701002
......
多贴点出来,以适用各种情况 ;Local $Str = FileRead('test.txt')
Local $Str = _
'济南市中大观园 3701001' & @CRLF & _
'济南市中经七路 3701002' & @CRLF & _
'济南市中六里山 3701003' & @CRLF & _
'济南市中七里山 3701004' & @CRLF & _
'济南市中二七村 3701005' & @CRLF & _
'济南市中玉函路 3701006' & @CRLF & _
'青岛市南金湖路 3702001' & @CRLF & _
'青岛市南中山路 3702002' & @CRLF & _
'青岛市a江苏路 3702003' & @CRLF & _
'青岛市a八大关 3702004' & @CRLF & _
'青岛市b八大湖 3702005' & @CRLF & _
'青岛市b湛山 3702006' & @CRLF & _
'青岛市b八大峡a 3702007'
Local $sR = StringRegExp($Str, '(?m)^([^\h]{2})([^\h]{2})([^\h]{2,})\h+\d+', 3)
Local $a1, $a2, $a3
Local $x = 0, $data1 = '请选择|'
For $i = 0 To UBound($sR) - 1 Step 3
$a1[$x] = $sR[$i]
$a2[$x] = $sR[$i + 1]
$a3[$x] = $sR[$i + 2]
$x += 1
Next
For $i = 0 To UBound($a1) - 1
If Not IsDeclared('_' & $a1[$i]) Then
$data1 &= $a1[$i] & '|'
Assign('_' & $a1[$i], 0)
EndIf
Next
GUICreate('级联test-Afan', 220, 150)
$Combo1 = GUICtrlCreateCombo("", 20, 10, 180, 25, 0x0003)
GUICtrlSetData(-1, $data1, '请选择')
$Combo2 = GUICtrlCreateCombo('', 20, 40, 180, 25, 0x0003)
$Combo3 = GUICtrlCreateCombo('', 20, 70, 180, 25, 0x0003)
$Button = GUICtrlCreateButton('读取', 50, 100, 120, 20)
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $Combo1, $Combo2
Go()
Case $Button
If GUICtrlRead($Combo1) = '请选择' Then ContinueLoop
$tmp = GUICtrlRead($Combo1) & GUICtrlRead($Combo2) & GUICtrlRead($Combo3)
$var = StringRegExp($Str, $tmp & '\h+(\d+)', 3)
If Not @error Then MsgBox(64, '数据', '单位名称:' & $tmp & @LF & '单位代码:' & $var)
EndSwitch
WEnd
Func Go()
If GUICtrlRead($nMsg) = '请选择' Then
GUICtrlSetData($Combo2, '')
GUICtrlSetData($Combo3, '')
Return
EndIf
Local $xx = 0
For $i = $nMsg - 3 To 1
SetData($i, $xx)
$xx += 1
Next
EndFunc ;==>Go
Func SetData($x, $m)
Local $rd = GUICtrlRead($nMsg + $m)
Local $df, $data, $_rd, $_next
Switch $x
Case 0
$_rd = $a1
$_next = $a2
Case 1
$_rd = $a2
$_next = $a3
EndSwitch
For $i = 0 To UBound($a1) - 1
If ($_rd[$i] = $rd) And (Not IsDeclared('_' & $_next[$i])) Then
$data &= $_next[$i] & '|'
Assign('_' & $_next[$i], 0)
If $df = '' Then $df = $_next[$i]
EndIf
Next
GUICtrlSetData($nMsg + 1 + $m, '|' & $data, $df)
EndFunc ;==>SetData 回复 6# Ziya
非常感谢!这个读取配置文件可以节省很多代码,不过只能联动选择单位,不能关联代码,希望能进一步赐教。感谢! 回复 7# afan
这一段正在整理,等整理完了,一定奉上!谢谢afan超版了! 回复 8# afan
这段代码已经把我要的效果解决了。但是就像afan超版说的,这样第二级只能是相同字符串,如果不一致就自动跑到第三级去了。
afan超版的代码太深奥了,看来学习之路还远着呢。
再次感谢各位的大力帮助!深深感到了论坛学习、互助氛围之浓厚! 本帖最后由 afan 于 2010-8-16 21:16 编辑
回复 11# flymouth
简单处理下文本即可,
将 “济南市中大观园 3701001” 改为 “济南,市中,大观园 3701001”
修改下正则即可处理了。最大限度减少修改原 txt文档工作。因为你说有几千个单位要处理……
我这代码也是基于此写的。
你不是说前两级是等长的么?都是两个字符,第三级不同也是处理了的 联动组合下拉,觉得采用数据库查询比较好 楼主起码自己要有个初级的模版。地区文档。不足之处大家帮你改吧。
你一点都不付出。不如去脚本交易区。 回复 14# xsjtxy
接受你提出的批评,代码我正在整理,我说过整理完成我会放上来。
不是我交易不起,如果去交易区或许能得到理想的结果,但是也有可能得不到想要的结果,还有只是想求教大家这个想法怎么实现,肯定不会把之用于其它用途。所以我想还是撇开交易大家一起交流比较能学到东西吧。
再次感谢大家给出的帮助!