2009-12-10 23 views
36

Ich benutze C#. Ich habe ein Windows-Formular mit einem Bearbeitungsfeld und einem Abbrechen-Button. Das Bearbeitungsfeld enthält Code im Validierungsereignis. Der Code wird jedes Mal ausgeführt, wenn die Bearbeitungsbox den Fokus verliert. Wenn ich auf die Schaltfläche Abbrechen klicke, möchte ich nur das Formular schließen. Ich möchte keine Validierung für das Bearbeitungsfeld ausführen. Wie kann dies erreicht werden?Wie kann ich die Validierung überspringen, nachdem ich auf die Abbrechen-Schaltfläche eines Formulars geklickt habe

Hier ist ein wichtiges Detail: Wenn die Validierung fehlschlägt, dann

  e.Cancel = true; 

die Kontrolle verlassen verhindert.

Wenn ein Benutzer jedoch auf Abbrechen klickt, sollte das Formular geschlossen werden, egal was passiert. Wie kann dies umgesetzt werden?

+1

Nichts, was Sie tun, um Die Schaltfläche Abbrechen verhindert, dass der Validierungscode ausgeführt wird, wenn Ihr Textfeld den Fokus verliert. – Stewbob

Antwort

15

Setzen Sie die Eigenschaft CausesValidation der Schaltfläche Abbrechen auf false.

2

Stellen Sie die CausesValidation Eigenschaft auf false.

1

Vernünftige Nutzung der Control.CausesValidation Eigenschaft hilft Ihnen zu erreichen, was Sie wollen.

39

Wenn die Validierung erfolgt, wenn das Eingabefeld den Fokus verliert, nichts über die die Abbruchtaste, dass nicht passiert stoppen wird.

Wenn die fehlgeschlagene Validierung jedoch verhindert, dass die Schaltfläche zum Abbrechen des Vorgangs ausgeführt wird, setzen Sie die Eigenschaft CausesValidation der Schaltfläche auf false.

Reference: Button.CausesValidation property

+0

Nicht sicher, warum jemand dies abgelehnt hat. Für eine winforms-Anwendung ist es wahr. Die anderen drei Antworten sind falsch. – Stewbob

+0

Es war nicht ich: D –

+1

@DanielSchaffer: ich bin mir nicht sicher, ob ich den "aber" -Teil richtig verstehe. Wie kann ich verhindern, dass die Validierung stattfindet, wenn der Benutzer die Abbrechen-Schaltfläche drückt? Die Validierung löst eine Meldungsbox aus, die immer angezeigt wird, auch wenn der Benutzer das Bearbeiten/Hinzufügen eines Objekts abbrechen möchte, da die Validierung vor dem Klicken auf die Schaltfläche erfolgt. Ich habe sogar versucht, 'CausesValidation = false' aus' MouseEnter' von 'BtnCancel' zu setzen (hat auch nicht funktioniert). –

27

Offensichtlich CausesValidation Eigenschaft der Schaltfläche muss auf false gesetzt werden und dann die Validierung Ereignis wird nie auf dem Klick passieren. Dies kann jedoch fehlschlagen, wenn für das übergeordnete Steuerelement der Schaltfläche die Eigenschaft CausesValidation auf true gesetzt ist. Die meiste Zeit vergisst/vergisst der Entwickler, die Eigenschaft CausesValidation des Containersteuerelements (wie das Panel-Steuerelement) zu ändern. Setze das auch auf Falsch. Und das sollte den Trick machen.

+4

Microsoft sollte den Standardwert "CausesValidation" für Container auf "False" festlegen, da sie den Fokus ohnehin nicht selbst übernehmen. –

+0

Wenn ich Container verschachtelt habe, muss ich sie für alle Container auf "False" setzen oder nur den unmittelbaren Elternteil meiner Schaltfläche? – dotNET

+0

Hier wieder nach ein paar Monaten :). Und ich habe es später selbst herausgefunden. Sie müssen es nicht für alle übergeordneten Container vollständig festlegen. Nur das unmittelbare Elternteil zu setzen ist ausreichend. – dotNET

2

Einstellung CausesValidation auf false ist der Schlüssel, aber dies allein reicht nicht aus. Wenn für die übergeordneten Schaltflächen CausesValidation auf "true" gesetzt ist, wird das Validierungsereignis weiterhin aufgerufen. In einem meiner Fälle hatte ich einen Abbrechen-Button in einem Panel auf einem Formular, also musste ich CausesValidation = false auf dem Panel und dem Formular setzen. Am Ende habe ich dies programmatisch wie es einfacher war, als alle Formen gehen durch ...

Control control = cancelButton; 

while(control != null) 
{ 
    control.CausesValidation = false; 
    control = control.Parent; 
} 
19

Ich habe Probleme bekommen meine Form, zu schließen, da die Validierung bestimmter Kontrollen zu stoppen war. Ich hatte die control.CausesValidation = false für die Abbrechen-Schaltfläche und alle Eltern der Abbrechen-Schaltfläche festgelegt. Hatte aber immer noch Probleme.

Es schien, dass, wenn der Benutzer mitten in der Bearbeitung eines Feldes war, das Validierung verwendet und einfach aufgegeben hat (das Feld mit einer ungültigen Eingabe belassen), das Abbrechen-Button-Ereignis wurde ausgelöst, aber das Fenster nicht schließen.

Dies wurde durch die folgenden in der Schaltfläche klicken Ereignis abbrechen behoben:

private void btnCancel_Click(object sender, EventArgs e) 
{ 
    // Stop the validation of any controls so the form can close. 
    AutoValidate = AutoValidate.Disable; 
    Close(); 
} 
+2

+1 für die Einfachheit. – Randy

0

In Ergänzung der Antwort von Daniel Schaffer: wenn die Validierung erfolgt, wenn das Eingabefeld den Fokus verliert, können Sie forbid the button to activate lokal umgehen Validierung und trotzdem beenden.

public class UnselectableButton : Button 
{ 
    public UnselectableButton() 
    { 
     this.SetStyle(ControlStyles.Selectable, false); 
    } 
} 

oder wenn Sie DevExpress:

this.simpleButtonCancel.AllowFocus = false; 

Hinweis, dass dadurch die Tastatur Erfahrung ändern: die Registerkarte mehr auf die Schaltfläche Abbrechen konzentrieren.

3

Keiner dieser Antworten hat die Aufgabe recht, aber die letzte Antwort von this thread tut. Grundsätzlich müssen Sie:

  1. Versichern, dass die Schaltfläche Abbrechen (falls vorhanden) auf false gesetzt .CausesValidation hat
  2. außer Kraft setzen diese virtuelle Methode.

    protected override bool ProcessDialogKey(Keys keyData) { 
        if (keyData == Keys.Escape) { 
         this.AutoValidate = AutoValidate.Disable; 
         CancelButton.PerformClick(); 
         this.AutoValidate = AutoValidate.Inherit; 
         return true; 
        } 
        return base.ProcessDialogKey(keyData); 
    } 
    

ich das nicht wirklich beantworten, nur auf die beiden Jungs zeigen, die tatsächlich getan hat.

0

Vielleicht möchten Sie BackgroundWorker verwenden, um eine kleine Verzögerung zu geben, so dass Sie entscheiden können, ob die Validierung ausgeführt werden soll oder nicht. Hier ist das Beispiel der Vermeidung der Validierung beim Schließen von Formularen.

// The flag 
    private bool _isClosing = false; 

    // Action that avoids validation 
    protected override void OnClosing(CancelEventArgs e) { 
     _isClosing = true; 
     base.OnClosing(e); 
    } 

    // Validated event handler 
    private void txtControlToValidate_Validated(object sender, EventArgs e) {   
     _isClosing = false; 
     var worker = new BackgroundWorker(); 
     worker.DoWork += worker_DoWork; 
     worker.RunWorkerAsync(); 
     worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
    } 

    // Do validation on complete so you'll remain on same thread 
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
     if (!_isClosing) 
      DoValidationHere(); 
    } 

    // Give a delay, I'm not sure this is necessary cause I tried to remove the Thread.Sleep and it was still working fine. 
    void worker_DoWork(object sender, DoWorkEventArgs e) { 
     Thread.Sleep(100); 
    } 
-1

Diese Arbeit für mich.

private void btnCancelar_MouseMove(object sender, MouseEventArgs e) 
{ 
    foreach (Control item in Form.ActiveForm.Controls) 
    { 
     item.CausesValidation = false; 
    } 
} 
+3

Warum und wie funktioniert das für Sie? – Unheilig

0

Direkt über dem Validierungscode auf dem Bearbeitungsfeld Add:

if (btnCancel.focused) 
    { 
    return; 
    } 

Das sollte es tun.

+0

Es tut es nicht für mich. –

0

In meinem Fall in Form ich die Eigenschaft AutoValidate zu EnableAllowFocusChange

0

von Visual Studio Wizzard verwenden Sie es so tun können:

enter image description here

Verwandte Themen