ListView Controll läst sich nicht leeren



  • Hi,
    Ich hab ein Dialog, indem ein ListView, ein button und ein Static drauf sind.
    In den ListView sollen mir alle aktuell laufenden prozesse angezeigt werden.
    In den Static, was gerade gemacht/passiert ist.
    Und beim klick auf den button, soll die Liste aktualisiert werden.
    Soweit sogut..Dialog funktioniert, ListView läst sich auch mit der aktuellen Prozessliste füllen, aber das ListView läst sich aus irgendeinen Grund nicht leeren. Hier der Codeteil, vom Button:

    case WM_COMMAND:
    		if(HIWORD(wParam) == BN_CLICKED) {
    			switch(LOWORD(wParam)) {
    			case ID_BUTTON_REFRESH:
    				{
    					HANDLE			hSnap;
    					PROCESSENTRY32	peProc;
    					int				index = 0;
    					BOOL			bDeleteRet = TRUE;
    
    					SetStatus(hWnd, L"Aktualisiere..");
    					SendMessage(GetDlgItem(hWnd, ID_LIST_PROCESS), LVM_DELETEALLITEMS, NULL, NULL);
    					ListView_DeleteAllItems(GetDlgItem(hWnd, ID_LIST_PROCESS));
    					while(!bDeleteRet) {
    						bDeleteRet = (BOOL)SendMessage(GetDlgItem(hWnd, ID_LIST_PROCESS), LVM_DELETEITEM, (WPARAM)0, NULL);
    					}
    					if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL)) != INVALID_HANDLE_VALUE) {
    						peProc.dwSize = sizeof(PROCESSENTRY32);
    						if(Process32First(hSnap, &peProc)) {
    							while(Process32Next(hSnap, &peProc)) {
    								index = SendDlgItemMessage(hWnd, ID_LIST_PROCESS, LB_ADDSTRING, NULL, (LPARAM)peProc.szExeFile);
    							}
    						}
    					}
    					if(!ListView_DeleteAllItems(GetDlgItem(hWnd, ID_LIST_PROCESS))) {
    						WCHAR tmp[128];
    						swprintf(tmp, 127, L"Error: %d", GetLastError());
    						MessageBox(NULL, tmp, NULL, NULL);
    					}
    					SetStatus(hWnd, L"Aktualisiert.");
    					return 0;
    
    				}
    			}
    		}
    
    		return 0;
    

    Ich hab schon auf mehreren Arten versucht, das ListView zu lerren. Über

    SendMessage(GetDlgItem(hWnd, ID_LIST_PROCESS), LVM_DELETEALLITEMS, NULL, NULL);
    

    Oder über das makro

    ListView_DeleteAllItems
    

    Als fehlermeldung bekomm ich ein

    Error: 18
    

    zurück, was laut Google ERROR_NO_MORE_FILES bedeutet.
    Hoffe ihr könnt mir helfen, such schon den ganzen Tag nach einer Lösung.

    Gruss, JoeBB.



  • Ist ID_LIST_PROCESS nun eine Listview oder eine Listbox? Die Verwendung von ListView_DeleteAllItems lässt Ersteres vermuten. Neue Elemente fügst du aber mit LB_ADDSTRING ein, für eine Listview geht es nur mit einem LVITEM und LVM_INSERTITEM, also irgendwie so:

    LVITEM lvi;
    memset(&lvi,0,sizeof(LVITEM));
    lvi.iItem = SendMessage(hwndLV,LVM_GETITEMCOUNT,0,0);//nr 
    lvi.mask = LVIF_TEXT|LVIF_GROUPID;
    lvi.iGroupId = 1;
    lvi.iSubItem = 0;
    lvi.pszText = TEXT("Spalte 0");
    ListView_InsertItem(hwndLV, &lvi);
    lvi.mask = LVIF_TEXT;
    lvi.iSubItem = 1;
    lvi.pszText = TEXT("Spalte 1");
    ListView_SetItem(hwndLV,&lvi);
    

    Falls du keine Gruppenansicht verwendest, muss lvi.mask natürlich nur LVIF_TEXT sein. Da du Elemente in einer Schleife einfügst, würde ich auch vorher und nachher ein WM_SETREDRAW mit WPARAM == 0 bzw. 1 an die Listview senden.



  • Ich sehe, du verwendest anscheinend doch eine Listbox. Die Elemente einer Listbox werden mit LB_RESETCONTENT gelöscht.



  • Ist eine ListBox. Dummer Anfänger Fehler 😕


Anmelden zum Antworten