it-swarm.com.de

Verhindern, dass ein Dialogfeld im Click-Ereignishandler der Schaltfläche geschlossen wird

Ich habe einen Dialog, den ich mit <class>.ShowDialog() zeige. Es hat einen OK-Button und einen Cancel-Button; Der OK-Button hat auch einen Event-Handler.

Ich möchte einige Eingabevalidierungen im Ereignishandler durchführen. Wenn dies fehlschlägt, benachrichtigen Sie den Benutzer mit einem Meldungsfeld und verhindern, dass das Dialogfeld geschlossen wird. Ich weiß nicht, wie ich den letzten Teil machen soll (das Schließen verhindern).

60
qster

Da Sie angegeben haben, dass Sie einen Popup-Fehlerdialogfeld wünschen, besteht eine Möglichkeit darin, Ihre Gültigkeitsprüfung in einen OnClosing -Ereignishandler zu verschieben. In diesem Beispiel wird das Formular schließen abgebrochen, wenn der Benutzer die Frage im Dialogfeld mit Ja beantwortet.

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
   // Determine if text has changed in the textbox by comparing to original text.
   if (textBox1.Text != strMyOriginalText)
   {
      // Display a MsgBox asking the user to save changes or abort.
      if(MessageBox.Show("Do you want to save changes to your text?", "My Application",
         MessageBoxButtons.YesNo) ==  DialogResult.Yes)
      {
         // Cancel the Closing event from closing the form.
         e.Cancel = true;
         // Call method to save file...
      }
   }
}

Durch die Einstellung von e.Cancel = true verhindern Sie, dass das Formular geschlossen wird.

Es wäre jedoch ein besseres Design/Benutzererlebnis, die Validierungsfehler inline anzuzeigen (durch Hervorheben der anstößigen Felder, Anzeigen von Tooltips usw.) und verhindern, dass der Benutzer die Schaltfläche OK in der Option auswählt erster Platz.

42
ChrisF

Sie können das Schließen abbrechen, indem Sie die DialogResult des Formulars auf DialogResult.None setzen.

Ein Beispiel, bei dem button1 der AcceptButton ist:

private void button1_Click(object sender, EventArgs e) {
  if (!validate())
     this.DialogResult = DialogResult.None;
}

Wenn der Benutzer auf button1 klickt und die validate-Methode false zurückgibt, wird das Formular nicht geschlossen.

128
Arjan

Verwenden Sie hierfür nicht das Ereignis FormClosing. Sie möchten dem Benutzer gestatten, den Dialog entweder mit Abbrechen oder dem Klicken auf das X zu schließen. Implementieren Sie einfach den Click-Ereignishandler der Schaltfläche OK und schließen Sie ihn nicht, bis Sie zufrieden sind:

private void btnOk_Click(object sender, EventArgs e) {
  if (ValidateControls())
    this.DialogResult = DialogResult.OK;
}

Dabei ist "ValidateControls" Ihre Validierungslogik. Gib false zurück, wenn etwas nicht stimmt.

16
Hans Passant

Verwenden Sie diesen Code:

private void btnOk_Click(object sender, EventArgs e) {
  if (ValidateControls())
    this.DialogResult = DialogResult.OK;
}

Das Problem ist, dass der Benutzer die Schaltflächen zweimal schließen muss, um die Formulare zu schließen.

3
cigos emmanuel

Dies beantwortet Ihre Frage nicht direkt (andere bereits), aber aus Sicht der Benutzerfreundlichkeit würde ich vorziehen, dass die beleidigende Schaltfläche deaktiviert wird, solange die Eingabe nicht gültig ist.

3
Benjol

Sie können FormClosing abfangen und erzwingen, dass das Formular geöffnet bleibt. Verwenden Sie dazu die Eigenschaft Cancel des Ereignisargumentobjekts.

e.Cancel = true;

und es sollte Ihr Formular am Schließen hindern.

2
Adrian Fâciu
void SaveInfo()
{
blnCanCloseForm = false;
Vosol[] vs = getAdd2DBVosol();
if (DGError.RowCount > 0)
return;

Thread myThread = new Thread(() =>
{
this.Invoke((MethodInvoker)delegate {
    picLoad.Visible = true;
    lblProcces.Text = "Saving ...";
});
int intError = setAdd2DBVsosol(vs);
Action action = (() =>
{
    if (intError > 0)
    {
        objVosolError = objVosolError.Where(c => c != null).ToArray();
        DGError.DataSource = objVosolError;// dtErrorDup.DefaultView;
        DGError.Refresh();
        DGError.Show();
        lblMSG.Text = "Check Errors...";
    }
    else
    {
        MessageBox.Show("Saved All Records...");
        blnCanCloseForm = true;
        this.DialogResult = DialogResult.OK;
        this.Close();
    }

});
this.Invoke((MethodInvoker)delegate {
    picLoad.Visible = false;
    lblProcces.Text = "";
});
this.BeginInvoke(action);
});
myThread.Start();
}

void frmExcellImportInfo_FormClosing(object s, FormClosingEventArgs e)
{
    if (!blnCanCloseForm)
        e.Cancel = true;
}
0
Ata Hoseini

Fügen Sie einfach eine Zeile in die Ereignisfunktion ein 

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                this->DialogResult = System::Windows::Forms::DialogResult::None;
             }
0
Croko

Ich wünschte, ich hätte Zeit, um ein besseres Beispiel zu finden, aber es wäre viel besser, wenn Sie die vorhandenen Windows Forms-Validierungstechniken dazu verwenden.

http://msdn.Microsoft.com/de-de/library/ms229603.aspx

0
Mesh