一次性更新Combo下拉框数据【已解决】
本帖最后由 xiehuahere 于 2012-11-19 19:25 编辑请教下,下面这样为何不能更新Combo下拉框中的数据?
#include <WinAPI.au3>
#include <GuiComboBox.au3>
$hGUI = GUICreate("test", 300, 250, -1, -1)
$hCombo = _GUICtrlComboBox_Create($hGUI, "", 40, 60, 120, 26)
GUISetState()
GUICtrlSetData(_WinAPI_GetDlgCtrlID($hCombo), "123456|ok", "ok")
Do
Until GUIGetMsg() = -3
使用_GUICtrlComboBox_Create创建(这个别改);而且实际运用中,我需要做去重等处理后再更新下拉框,用于保存历史查询记录,最新的在最上面。
貌似 _GUICtrlComboBox_ 开头的函数没有更新所有下拉框数据的,只能在创建时一次性添加。 应该没有该函数,_GUICtrlComboBox_Create 创建时也是循环添加的,自己写个。#include <WinAPI.au3>
#include <GuiComboBox.au3>
$hGUI = GUICreate("test", 300, 250, -1, -1)
$hCombo = _GUICtrlComboBox_Create($hGUI, "ss|111", 40, 60, 120, 26)
GUISetState()
_GUICtrlComboBox_SetData($hCombo, "123456|ok|ok1", "ok")
Do
Until GUIGetMsg() = -3
Func _GUICtrlComboBox_SetData($hWnd, $sText, $default = '')
If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)
Local $aText, $sDelimiter = Opt('GUIDataSeparatorChar')
If $sText = '' Or StringLeft($sText, 1) == $sDelimiter Then
_SendMessage($hWnd, 0x14B) ;$CB_RESETCONTENT = 0x14B
$sText = StringTrimLeft($sText, 1)
If $sText = '' Then Return
EndIf
$aText = StringSplit($sText, $sDelimiter)
For $x = 1 To $aText
_SendMessage($hWnd, 0x143, 0, $aText[$x], 0, 'wparam', 'wstr') ;$CB_ADDSTRING = 0x143
Next
If $default = '' Then Return
$iIndex = _SendMessage($hWnd, 0x158, -1, $default, 0, 'wparam', 'wstr') ;$CB_FINDSTRINGEXACT = 0x158
_SendMessage($hWnd, $CB_SETCURSEL, $iIndex) ;$CB_SETCURSEL = 0x14E
EndFunc ;==>_GUICtrlComboBox_SetData 分析:
根据 GuiComBox.au3
334-339行源代码
If StringLen($sText) Then
$aText = StringSplit($sText, $sDelimiter)
For $x = 1 To $aText
_GUICtrlComboBox_AddString($hCombo, $aText[$x])
Next
EndIf
可知
_GUICtrlComboBox_Create 函数的第二个参数 可以用 含有 | 分隔的 一组字符串
来实现下拉菜单的各个条目
#include <WinAPI.au3>
#include <GuiComboBox.au3>
$hGUI = GUICreate("test", 300, 250, -1, -1)
$hCombo = _GUICtrlComboBox_Create($hGUI, "baidu|google|autoit", 40, 60, 120, 26)
GUISetState()
Do
Until GUIGetMsg() = -3
貌似 无法用 guictrlsetdata 或 _GUICtrlComboBox_AddString 一次搞定对个选项 再次从GuiComBox.au3
找到 Func _GUICtrlComboBox_AddString($hWnd, $sText)
If $Debug_CB Then __UDF_ValidateClassName($hWnd, $__COMBOBOXCONSTANT_ClassName)
If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
Return _SendMessage($hWnd, $CB_ADDSTRING, 0, $sText, 0, "wparam", "wstr")
EndFunc ;==>_GUICtrlComboBox_AddString
故 推测
可以自己写个函数 封装一下和 StringSplit 和 _SendMessage 本帖最后由 veket_linux 于 2012-11-19 19:10 编辑
成功了
#include <WinAPI.au3>
#include <GuiComboBox.au3>
$hGUI = GUICreate("test", 300, 250, -1, -1)
$hCombo = _GUICtrlComboBox_Create($hGUI, "", 40, 60, 120, 26)
GUISetState()
MyComboBoxSetAllItem($hCombo, "百度|google|AutoIt中文论坛")
Do
Until GUIGetMsg() = -3
Func MyComboBoxSetAllItem($hWnd, $items_string)
If $items_string <> "" Then
Local $items = StringSplit($items_string, "|")
Local $i
For $i = 1 To $items
_SendMessage($hWnd, $CB_ADDSTRING, 0, $items[$i], 0, "wparam", "wstr")
Next
EndIf
EndFunc
没有枪... 没有炮 ... 我们自己来造..... 嗯,了解了。
多谢大家热心帮忙!
_SendMessage用得太少。学习了~~ 本帖最后由 netegg 于 2012-11-19 19:51 编辑
_GUICtrlComboBox_ResetContent
更新的重点不久在所有数据重置吗?现成的,数据另外加 回复 8# netegg
实测 此函数是 清空了所有选项 ......... 我不想影响到edit control中的内容 本帖最后由 netegg 于 2012-11-20 11:36 编辑
#Include <GuiListBox.au3>
#include<Guicombobox.au3>
if _GUICtrlComboBox_GetComboBoxInfo($hCombo, $tInfo) then
$hList = DllStructGetData($tInfo, "hList")
_GUICtrlListBox_ResetContent($hList)
_GUICtrlListBox_addstring($hList, _GUICtrlComboBox_getedittext($hCombo))
endif _GUICtrlComboBox_ResetContent
更新的重点不久在所有数据重置吗?现成的,数据另外加
netegg 发表于 2012-11-19 19:48 http://www.autoitx.com/images/common/back.gif
我在2#写的代码中包括了此功能。也因此所有功能和 GuiCtrlSetData() 针对Combobox 控件的数据设置功能一致。
_GUICtrlComboBox_SetData( 控件句柄, 数据 [, 默认值] )
如果“数据”对应于一个已存在的条目,则将它设置为默认.
如果 "数据"以 GUIDataSeparatorChar(设置的分隔符) 开始或空串 "" ,则前一条列表被销毁. 回复 9# veket_linux
'更新所有下拉框数据'
楼主这个要求不清空怎么更新,项目数都不一定相同 路过学习一下! 回复 13# netegg
是的,you're right.
要先清再更新的。
页:
[1]
2