找回密码
 加入
搜索
查看: 20077|回复: 47

[GUI管理] 关于LISTVIEW数据更新问题(附上源码,大家别让它卡壳了= =!)

 火.. [复制链接]
发表于 2010-8-14 07:05:34 | 显示全部楼层 |阅读模式
本帖最后由 cutyourchicken 于 2010-8-27 15:21 编辑

各位兄弟,请问你们是如何将一个数组的数据更新到LISTVIEW的ITEM控件的呢?数组数据每隔一秒更新,同时也要更新到ITEM上面。我不想用DELETEITEM,请问兄弟们有什么方法吗?谢谢!假如我的数据例子是:[电脑名称,IP地址,MAC地址,上传速度,下载速度],每台电脑开机就会连上服务端,并发送如上数据。我用stringsplit函数处理成数组。然后用类似ADDITEM的函数添加到ITEM里面,但是到下一秒有新的数据,ITEM更新就开始出问题了。不断添加相同的ITEM,SUBITEM的数据却可以更新,后来我添加判断语句,有相同的ITEM就只更新SUBITEM,当客户端在4台以下更新数据正常,但是当有4台电脑以上连上服务端的时候就还是出现自动添加相同ITEM的情况 。如果兄弟们想看看源代码我会上传。希望兄弟们能帮帮忙修改FOR 中的IF判断可以让数据更新正常
 楼主| 发表于 2010-8-14 07:22:21 | 显示全部楼层

附上代码

本帖最后由 cutyourchicken 于 2010-8-14 09:31 编辑

客户端的:
#include <String.au3>

#include <GUIConstantsEx.au3>
If Not FileExists(@ScriptDir&""&"Client.ini") Then
        MsgBox(0+16,"错误:","配置文件丢失!",20,"")
        Exit
EndIf

$SVRIP= IniRead(@ScriptDir&""&"Client.ini","Config","Server","")
$Port= IniRead(@ScriptDir&""&"Client.ini","Config","Port","")


$_IfTable=_GetIfTable()

Global $_Down=$_IfTable[0]

Global $_UpDate=$_IfTable[1]
TCPStartup()


While 1
        
Sleep(1000)
        _Strat_Time()

WEnd


Func _Strat_Time()

        $_IfTable=_GetIfTable()

        $r_up= "+"&@ComputerName&","&@IPAddress1&","&"在线"&","&Round(($_IfTable[0]-$_Down)/1024,2)&"KB/S"&","&Round(($_IfTable[1]-$_UpDate)/1024,2)&"KB/S"


        
                
                
        $go1=StringToBinary($r_up,2)        
        $socket= TCPConnect($SVRIP,$Port)
        If $socket = -1 Then 
        MsgBox(0+16,"错误:","通讯失败!")
        Exit
EndIf

        TCPSend($socket,$go1)
                
                
        Global $_Down=$_IfTable[0]

        Global $_UpDate=$_IfTable[1]

EndFunc



Func _GetIfTable()

        $_Return=DllCall("Iphlpapi.dll","long","GetIfTable","ptr",0,"ulong*",0,"int",0)

        $_aBuffer=DllStructCreate("byte[" & $_Return[2] & "]")

        $_Return=DllCall("Iphlpapi.dll","long","GetIfTable","ptr",DllStructGetPtr($_aBuffer),"ulong*",DllStructGetSize($_aBuffer),"int",0)

        $_Number=DllStructCreate("dword",DllStructGetPtr($_aBuffer))

        $_Number=DllStructGetData($_Number,1)

        $_MIB_IFROW="dword" & _StringRepeat(";wchar[256];dword[5];byte[8];dword[16];byte[256]",$_Number)

        $_MIB_IFTABLE=DllStructCreate($_MIB_IFROW,DllStructGetPtr($_aBuffer))

        Dim $_Table[2]

        For $i=2 To $_Number * 5 Step 5                

                $_Table[0]+=DllStructGetData($_MIB_IFTABLE,$i+3,4)

                $_Table[1]+=DllStructGetData($_MIB_IFTABLE,$i+3,10)

        Next        

        Return $_Table

EndFunc
服务端的:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#Include <file.au3>
#Include <Array.au3>
Dim $DealData
Dim  $HWD[1000]
Dim $DealCom 
Dim $DataRip


$Form1_1 = GUICreate("服务端v1.0", 773, 574, 223, 123)
$ListView1 = GUICtrlCreateListView("      电脑|IP地址|状态|下载速度|上传速度", 18, 8, 737, 497, -1,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 50)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 200)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 4, 200)
_GUICtrlListView_JustifyColumn(GUICtrlGetHandle($ListView1), 1, 2)
_GUICtrlListView_JustifyColumn(GUICtrlGetHandle($ListView1), 2, 2)
_GUICtrlListView_JustifyColumn(GUICtrlGetHandle($ListView1), 3, 2)
$Checkbox1 = GUICtrlCreateCheckbox("开机自动运行", 48, 528, 145, 25)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Checkbox2 = GUICtrlCreateCheckbox("收到消息弹出", 265, 528, 145, 25)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Button1 = GUICtrlCreateButton("设置", 456, 520, 105, 41, -1, BitOR($WS_EX_CLIENTEDGE,$WS_EX_STATICEDGE))
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
$Button2 = GUICtrlCreateButton("关于", 601, 520, 105, 41, -1, BitOR($WS_EX_CLIENTEDGE,$WS_EX_STATICEDGE))
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)


$zhucaidan = GUICtrlCreateContextMenu($ListView1)
$yuanchengkongzhi = GUICtrlCreateMenuItem(" 远程控制 ", $zhucaidan)
GUICtrlCreateMenuItem("", $zhucaidan)
$yuanchengzhuomian = GUICtrlCreateMenuItem(" 远程桌面 ", $zhucaidan)
GUICtrlCreateMenuItem("", $zhucaidan)
$wenjianchuanshu = GUICtrlCreateMenuItem(" 文件传输 ", $zhucaidan)
GUICtrlCreateMenuItem("", $zhucaidan)
$jinchengchakan= GUICtrlCreateMenuItem(" 进程查看 ", $zhucaidan)
GUICtrlCreateMenuItem("", $zhucaidan)
$jieshujincheng = GUICtrlCreateMenuItem(" 结束进程 ", $zhucaidan)
GUICtrlCreateMenuItem("", $zhucaidan)
$yunxingchengxu = GUICtrlCreateMenuItem(" 运行程序 ", $zhucaidan)

GUICtrlCreateMenuItem("", $zhucaidan)
$fasongxiaoxi = GUICtrlCreateMenuItem(" 发送消息 ", $zhucaidan)



GUISetState(@SW_SHOW)
If  Not FileExists(@ScriptDir&""&"Config.ini") Then 
MsgBox(0+16,"错误:","配置文件丢失!","30",$Form1_1)
Exit
EndIf

$serverip = IniRead(@ScriptDir&""&"Config.ini","Feature","ServerIP","")

$ComPort = IniRead(@ScriptDir&""&"Config.ini","Feature","ComPort","")

TCPStartup()
$createskt= TCPListen($serverip,$ComPort)
If $createskt =-1  Then
        MsgBox(0+16,"错误:","通讯服务启动失败!",30,$Form1_1)
        Exit
EndIf

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

                Case $Button1
                Case $Button2
        EndSwitch
$accskt= TCPAccept($createskt)
$RecData = TCPRecv($accskt,5000000,1)
        
        If $RecData <> "" Then
                $DealData=BinaryToString($RecData,2)
                $DealCom=StringSplit($DealData,"+",1)
                #cs
                _FileWriteLog(@ScriptDir&""&"datatransport.log","$DealCom[0]="&$DealCom[0],1)
                _FileWriteLog(@ScriptDir&""&"datatransport.log","$DealCom[1]="&$DealCom[1],1)
                _FileWriteLog(@ScriptDir&""&"datatransport.log","$DealCom[2]="&$DealCom[2],1)
                #ce
                $count= 0
                For $Num = 1  To $DealCom[0]
                        $DataRip=StringSplit($DealCom[$Num+1],",",1)
                        #cs
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","$DealCom[$Num+1]="&$DealCom[$Num+1],1)
                        #ce
                        
                        $get=_GUICtrlListView_GetItemText($ListView1, $Num-1)
                        $getpre = _GUICtrlListView_GetItemText($ListView1, $count+1)
                        If  $get = $DataRip[1] Then 
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","1if,OK!",1)
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","$count="&$count,1)
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","$getpre="&$getpre,1)
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","$DataRip[1]"&$DataRip[1],1)
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","$get="&$get,1)
                        _GUICtrlListView_SetItemText($ListView1,$count,$DataRip[2],1)
                        
                        _GUICtrlListView_SetItemText($ListView1,$count,$DataRip[3],2)
                        
                        _GUICtrlListView_SetItemText($ListView1,$count,$DataRip[4],3)
                        
                        _GUICtrlListView_SetItemText($ListView1,$count,$DataRip[5],4)
                        
                        
                        
                        
                ElseIf $get ="" And $getpre <> $DataRip[1] Then
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","2if,OK!",1)
                        _GUICtrlListView_AddItem($ListView1,$DataRip[1],"","") 
                        
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","2ADD,OK!",1)
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[2],1,"")
                        
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[3],2,"")
                        
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[4],3,"")
                        
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[5],4,"")
                        
                Else
                        If $get<>"" And $get <> $DataRip[1]  Then
                        $count+=1
                        
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","3if,OK!",1)
                        If $get <> $DataRip[1]  Then
                        _GUICtrlListView_AddItem($ListView1,$DataRip[1],"","") 
                        _FileWriteLog(@ScriptDir&""&"datatransport.log","3ADD,OK!",1)
                        $count+=1
                        EndIf
                
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[2],1,"")
                        
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[3],2,"")
                        
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[4],3,"")
                        
                        _GUICtrlListView_AddSubItem($ListView1,$count,$DataRip[5],4,"")
                        ExitLoop
                EndIf
        EndIf
        
                
                        $count+=1
                        
                        
                        If $Num = $DealCom[0]-1 Then ExitLoop
                Next
                
        EndIf
         
                        
                        
                        
                        
        
        
WEnd
发表于 2010-8-14 08:22:20 | 显示全部楼层
本帖最后由 水木子 于 2010-8-14 08:28 编辑

用这个函数啊!

GUICtrlCreateListViewItem
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
Opt("TrayMenuMode", 1)
$Path = @ScriptDir & "\config.ini"

GUICreate("ListView", 300, 300)
$ListView1 = GUICtrlCreateListView("账号|密码|", 10, 10, 280, 170)
_GUICtrlListView_SetColumnWidth($ListView1, 0, 130)
_GUICtrlListView_SetColumnWidth($ListView1, 1, 130)

$But1 = GUICtrlCreateButton("添加", 210, 208, 70, 25, $WS_GROUP)
$But2 = GUICtrlCreateButton("删除", 210, 248, 70, 25, $WS_GROUP)

$Name = GUICtrlCreateInput("", 68, 210, 140, 21)
$Pass = GUICtrlCreateInput("", 68, 250, 140, 21)
$Number = GUICtrlCreateGroup("", 8, 185, 284, 105)

GUICtrlCreateLabel("账号:", 20, 210, 48, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
GUICtrlCreateLabel("密码:", 20, 250, 48, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
Read()
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $But1
                        Add(GUICtrlRead($Name), GUICtrlRead($Pass))
                Case $But2
                        Del()
        EndSwitch
WEnd

Func Read()
        _GUICtrlListView_DeleteAllItems($ListView1)
        $read = IniReadSection($Path, "config")
        If Not @error Then
                For $i = 1 To $read[0][0]
                        GUICtrlCreateListViewItem($read[$i][0] & '|' & $read[$i][1], $ListView1)
                Next
                GUICtrlSetData($Number, '共有 ' & _GUICtrlListView_GetItemCount($ListView1) & ' 行数据')
        EndIf
EndFunc   ;==>Read

Func Add($Name, $Pass)
        If $Name <> "" And $Pass <> "" Then
                IniWrite($Path, "config", $Name, $Pass)
                GUICtrlCreateListViewItem($Name & '|' & $Pass, $ListView1)
                MsgBox(64, "提示", " 保存成功 " & @CRLF & @CRLF & " 账号: " & $Name & @CRLF & @CRLF & " 密码: " & $Pass)
                GUICtrlSetData($Name, "")
                GUICtrlSetData($Pass, "")
                GUICtrlSetState($Name, $GUI_FOCUS)
                GUICtrlSetData($Number, '共有 ' & _GUICtrlListView_GetItemCount($ListView1) & ' 行数据')
        EndIf
EndFunc   ;==>Add

Func Del()
        $sItem = _GUICtrlListView_GetSelectedIndices($ListView1)
        $sText = _GUICtrlListView_GetItemTextString($ListView1, Number($sItem))
        If Not StringLen($sItem) Then
                MsgBox(48, '提示', '请选中需要删除的项目!')
                Return
        EndIf

        $Split = StringSplit($sText, "|")
        If MsgBox(32 + 1, "提示", "请确认是否删除以下数据" & @CRLF & @CRLF & "账号:" & $Split[1] & @CRLF & @CRLF & "密码:" & $Split[2]) = 1 Then
                _GUICtrlListView_DeleteItemsSelected($ListView1) ;删除选定项目
                IniDelete($Path, 'config', $Split[1])
                GUICtrlSetData($Number, '共有 ' & _GUICtrlListView_GetItemCount($ListView1) & ' 行数据')
        EndIf
EndFunc   ;==>Del
 楼主| 发表于 2010-8-14 08:23:36 | 显示全部楼层
恩,是用这个函数的,效果一样
 楼主| 发表于 2010-8-14 08:24:02 | 显示全部楼层
additem也试过了
 楼主| 发表于 2010-8-14 08:25:38 | 显示全部楼层
不知道水木子兄弟是否做过这样的GUI呢?
 楼主| 发表于 2010-8-14 08:27:59 | 显示全部楼层
如果可以,想麻烦水木子兄弟,写个例子出来
 楼主| 发表于 2010-8-14 08:30:09 | 显示全部楼层
回复 3# 水木子


    可以创建ITEM,但是更新出问题了
发表于 2010-8-14 08:30:57 | 显示全部楼层
回复 7# cutyourchicken

3楼有例子!
 楼主| 发表于 2010-8-14 08:34:01 | 显示全部楼层
回复 9# 水木子


    我看过你的例子了,里面用到DELETEITEM,那样效率不高,郁闷!它更新ITEM时候不断添加相同的0索引ITEM,SUBITEM的数据却可以更新,后来我添加判断语句,有相同的ITEM就只更新SUBITEM,当客户端在4台以下更新数据正常,但是当有4台电脑以上连上服务端的时候就还是出现自动添加相同ITEM的情况 。
 楼主| 发表于 2010-8-14 08:37:05 | 显示全部楼层
看来我下午再把源代码放上来好了,希望水木子兄弟和各位高手看看哪里出问题了。
发表于 2010-8-14 08:37:36 | 显示全部楼层
需要判断 如果存在相同的项目,则不需要创建项目,而只需要对项目文本更新。
 楼主| 发表于 2010-8-14 08:40:27 | 显示全部楼层
回复 12# 水木子


    是的,我也曾加了一个判断语句,但等有4台以上的电脑连接并发送数据的时候,就又自动添加相同的0索引ITEM了,下午我回去把源代码放上来,麻烦你看看好吗?
 楼主| 发表于 2010-8-14 08:45:21 | 显示全部楼层
我是测试了很多次,从数据发送到传输到处理到处理成数组都一点点确认过了,也查了UDF解决不了,才敢上来提问的,可能我自己钻牛角尖了。顺便问问如何提升阅读权限呢?
 楼主| 发表于 2010-8-14 09:45:16 | 显示全部楼层
顶上去 = =
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-12 01:24 , Processed in 0.083731 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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