2 Stimmen

Wie kann man verhindern, dass eine bindingSouce/ComboBox die Auswahl ändert?

Ich habe ein einfaches Formular mit Liste als Datenquelle, eine Bindung Quelle gebunden an die Liste, und ein Kombinationsfeld gebunden an die Bindung Quelle mit einigen Feldern bearbeiten, was die bindingSource.Current ist. Was ich tun möchte, ist, wenn ein bool gesetzt ist, ein Dialog zu öffnen, der fragt, ob sie Änderungen speichern möchten, bevor sie Elemente ändern. Wenn sie nein sagen, möchte ich Folgendes aufrufen CancelEdit() Wenn ja, möchte ich, dass sie auf dem aktuellen Element bleiben, damit sie auf die Schaltfläche "Speichern" klicken können. Wie kann ich das tun?

Der zweite Teil meiner Frage ist, weil meine unterstrichene Datenquelle eine List<View> wird CancelEdit() überhaupt etwas tun? (View ist nur eine Klasse mit string Name y un List<CustomColumn>

Bearbeiten: Lassen Sie mich auf das, was ich tue, um vielleicht helfen zu erklären, was ich tue, zu erarbeiten. Ich habe eine Liste von View, die an anderer Stelle im Programm aufgezählt wird, um eine DataGridView . Dieses Menü dient dazu, neue "Ansichten" hinzuzufügen und die Reihenfolge der Spalten in der Ansicht zu ändern (die Ansicht selbst wird dabei nicht bearbeitet). CustomColumn nur das Hinzufügen von Elementen und das Ändern der Reihenfolge der list<CustomColumn> ). Was ich möchte, ist, dass, wenn jemand auf Abbrechen drückt oder zu einer neuen Ansicht wechselt, indem er das Kombinationsfeld verwendet, ohne zu speichern, alle Änderungen, die er an der List<CustomColumn>

1voto

Bradley Smith Punkte 13023

Wenn ich Ihre Frage richtig deute, dann ist die Antwort keine, die Ihnen gefallen wird; die ComboBox hat keinen Mechanismus, um eine Änderung der Auswahl aufzuheben. Ich wünschte, es wäre so, denn ich bin immer wieder auf dieses Problem gestoßen. So würde ich diese Einschränkung umgehen:

bool ignoreEvent = false;
object lastSelectedItem = null;

void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
    if (ignoreEvent) return;

    if (CheckForChanges()) {
        if (MessageBox.Show("Do you want to save changes?", "Save changes", MessageBoxButtons.YesNo) == DialogResult.Yes) {
            ignoreEvent = true;
            comboBox1.SelectedItem = lastSelectedItem;
            ignoreEvent = false;
        }
        else {
            // call CancelEdit() here
        }          
    }

    lastSelectedItem = comboBox1.SelectedItem;
}

Im Grunde genommen bietet der obige Code die Möglichkeit, die ComboBox auf den zuvor ausgewählten Wert zurückzusetzen, ohne dabei einen Event-Handler-Code aufzurufen. Die Benutzer sehen kurz, wie sich ihre Auswahl ändert, und kehren dann zurück, wenn sie auf dem Popup mit "Nein" antworten.

Außerdem haben Sie Recht mit Ihrer Behauptung, dass CancelEdit() im Grunde nichts bewirkt - die generische List-Sammlung unterstützt keine Änderungserkennung. Vielleicht möchten Sie eine DataTable oder eine ObservableCollection verwenden, die beide die Erkennung von Änderungen unterstützen.

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