找回密码
 加入
搜索
查看: 16017|回复: 44

[AU3基础] 求教关于三级联动组合下拉框

 火... [复制链接]
发表于 2010-8-16 14:59:33 | 显示全部楼层 |阅读模式
本帖最后由 flymouth 于 2010-8-16 15:13 编辑

从论坛上看到一个帖子:http://www.autoitx.com/forum.php ... hlight=%CF%C2%C0%AD,是关于级联下拉菜单的,但是想要一个三级联动的组合下拉框,求教:
问题如下:


有如下的一个对应关系:

济南市中大观园        3701001
济南市中经七路        3701002               
济南市中六里山        3701003
济南市中七里山        3701004
济南市中二七村        3701005       
济南市中玉函路        3701006
青岛市南金湖路        3702001
青岛市南中山路        3702002
青岛市南江苏路        3702003
青岛市南八大关        3702004
青岛市南八大湖        3702005
青岛市南湛山路        3702006
青岛市南八大峡        3702007


打算用三级联动菜单,来实现通过选择单位,让程序自动赋值单位和代码。
如第一级为:济南、青岛

第二级为第一级的下属单位:
如选择济南则为:市中、历下、天桥、槐荫
如选择青岛则为:市南、市北、李沧、城阳

第三级为第二级的下属单位:
如选择济南市中则为:大观园、经七路、六里山、七里山、二七新村、玉函路
如选择济南历下则为:大明湖、解放路、轻骑路、趵突泉、司里街
如选择青岛市南则为:金湖路、中山路、江苏路、八大关、八大湖、湛山路、八大峡
如选择青岛市北则为:登州路、冠县路、热河路、华阳路、延安路

第三级选择完成后,要得到两个变量一个是单位名称、另一个是单位代码,后面会用到。


求教如何实现以上想法,是否还有更便捷的办法,如把单位和对应代码作为配置文件,直接读取,应为大概有这样的几千个个单位要处理。
发表于 2010-8-16 15:13:57 | 显示全部楼层
如果各级字符串数量一致就很好办
 楼主| 发表于 2010-8-16 15:15:17 | 显示全部楼层
第三级是不一致的。前两级一致。
发表于 2010-8-16 15:17:53 | 显示全部楼层
#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

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-8-16 15:30:16 | 显示全部楼层
谢谢,很感谢你的回复,这个我刚才试过,还有更简单的方法么?比如读取配置文件?
发表于 2010-8-16 16:13:57 | 显示全部楼层
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[0]
        $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[0][0]
                                $c2 = $c2 & $var[$i][0] & "|"
                        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"内容为:
[济南]
市中=大观园|经七路|六里山|七里山|二七新村|玉函路
历下=大明湖|解放路|轻骑路|趵突泉|司里街

[青岛]
市南=金湖路|中山路|江苏路|八大关|八大湖|湛山路|八大峡
市北=登州路|冠县路|热河路|华阳路|延安路

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-8-16 16:23:18 | 显示全部楼层
LZ 把文本
济南市中大观园        3701001
济南市中经七路        3701002
......
多贴点出来,以适用各种情况
发表于 2010-8-16 18:16:30 | 显示全部楼层
;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[UBound($sR) / 3], $a2[UBound($sR) / 3], $a3[UBound($sR) / 3]
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[0])
        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
 楼主| 发表于 2010-8-16 21:00:00 | 显示全部楼层
回复 6# Ziya

非常感谢!这个读取配置文件可以节省很多代码,不过只能联动选择单位,不能关联代码,希望能进一步赐教。感谢!
 楼主| 发表于 2010-8-16 21:00:57 | 显示全部楼层
回复 7# afan

这一段正在整理,等整理完了,一定奉上!谢谢afan超版了!
 楼主| 发表于 2010-8-16 21:07:35 | 显示全部楼层
回复 8# afan

这段代码已经把我要的效果解决了。但是就像afan超版说的,这样第二级只能是相同字符串,如果不一致就自动跑到第三级去了。
afan超版的代码太深奥了,看来学习之路还远着呢。
再次感谢各位的大力帮助!深深感到了论坛学习、互助氛围之浓厚!
发表于 2010-8-16 21:11:28 | 显示全部楼层
本帖最后由 afan 于 2010-8-16 21:16 编辑

回复 11# flymouth


    简单处理下文本即可,
将 “济南市中大观园        3701001” 改为 “济南,市中,大观园        3701001”
修改下正则即可处理了。最大限度减少修改原 txt文档工作。因为你说有几千个单位要处理……
我这代码也是基于此写的。

你不是说前两级是等长的么?都是两个字符,第三级不同也是处理了的
发表于 2010-8-16 22:04:33 | 显示全部楼层
联动组合下拉,觉得采用数据库查询比较好
发表于 2010-8-16 22:12:56 | 显示全部楼层
楼主起码自己要有个初级的模版。地区文档。不足之处大家帮你改吧。

你一点都不付出。不如去脚本交易区。
 楼主| 发表于 2010-8-17 07:41:03 | 显示全部楼层
回复 14# xsjtxy
接受你提出的批评,代码我正在整理,我说过整理完成我会放上来。
不是我交易不起,如果去交易区或许能得到理想的结果,但是也有可能得不到想要的结果,还有只是想求教大家这个想法怎么实现,肯定不会把之用于其它用途。所以我想还是撇开交易大家一起交流比较能学到东西吧。
再次感谢大家给出的帮助!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 07:49 , Processed in 0.096941 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表