3 Stimmen

CVSListBox-Benachrichtigung nach dem Löschen

Ich habe gerade eines der neuen (MFC Feature Pack) CVSListBox Controls zu einem Projekt hinzugefügt. Die Liste der Elemente in dem Steuerelement wird von einigen anderen Objekten in meiner Anwendung verfolgt, so dass ich viele Benachrichtigungen von der Listbox erhalten muss, wenn sich etwas ändert, damit ich andere Dinge aktualisieren kann. Für diejenigen, die das Steuerelement nicht kennen, gibt es eine Schaltflächenleiste, die grundlegende Funktionen zum Hinzufügen/Löschen/Bestellen bietet.

Das CVSListBox-Steuerelement bietet überschreibbare virtuelle Funktionen für Dinge wie das Hinzufügen oder Umbenennen von Elementen und das Ändern ihrer Reihenfolge - all dies funktioniert gut.

Für das Löschen von Elementen gibt es jedoch nur die Überschreibung OnBeforeRemoveItem, die aufgerufen wird, BEVOR ein Element entfernt wird, und von der man TRUE/FALSE zurückgeben muss, um das Entfernen zu erlauben. Sobald das Entfernen erfolgt ist, gibt es keine spezifische Benachrichtigung.

Wie kann ich am besten NACH einer Entfernung benachrichtigt werden?

Offensichtlich ist es möglich, etwas schrecklich hier zu hacken, in dem es eine Auswahl-geändert-Ereignis nach einem entfernen, und es wäre möglich, ein Flag von der vor-entfernen zu halten, um zu sagen, dass die nächste Auswahl-geändert ist speziell. Aber ich habe das Gefühl, dass ich etwas Sauberes und Offensichtlicheres vermisse. Irgendwelche Vorschläge?

1voto

Aidan Ryan Punkte 11109

In der Annahme, dass der Gegenstand wirklich jedes Mal entfernt wird, könnten Sie entweder:

  • Führen Sie die Behandlung in der OnBeforeRemoveItem-Überschreibung durch, als ob das Element bereits entfernt worden wäre
  • Lösen Sie Ihr eigenes OnAfterItemRemoved-Ereignis aus
  • Versuchen Sie, das zugrundeliegende Listensteuerelement (was auch immer es sein mag) in den Griff zu bekommen und eines seiner Ereignisse einzuhängen

0voto

Albertino80 Punkte 993

Versuchen Sie so etwas:

class my_lbox : public CVSListBox
{
    protected:

        BOOL OnBeforeRemoveItem(int what_item)
        {
            CString txt = GetItemText(what_item);
            DWORD_PTR idata = GetItemData(what_item);

            if(true) //up to you to check if this item can be removed
            {
                OnAfterRemoveItem(txt,idata);
                return TRUE;
            }
            return FALSE;
        }

        void OnAfterRemoveItem(const CString& txt, DWORD_PTR idata)
        {
            CString info;
            info.Format(L"Removing item:'%s'",txt);

            MessageBox(info);
        }
};

Ich hoffe, es hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X