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).
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.
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.
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.
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.
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.
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.
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;
}
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;
}
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.