Windows 窗体 - 如何中断当前正在执行的代码的执行

Posted

技术标签:

【中文标题】Windows 窗体 - 如何中断当前正在执行的代码的执行【英文标题】:Windows Forms - How to break execution of currently executing code 【发布时间】:2014-10-21 09:26:59 【问题描述】:

我有一个名为 AddEditReminderForm 的抽象窗口窗体,其中包含一个事件处理程序和一个方法:

    buttonSave_Click 执行验证

这里是AddEditReminderForm的相关代码:

protected virtual void buttonSave_Click(object sender, EventArgs e)

    title = textboxTitle.Text;
    description = textboxDescription.Text;
    place = textboxPlace.Text;
    date = datePicker.Value.Date;
    time = timePicker.Value.TimeOfDay;

    PerformValidations();


protected void PerformValidations()

    if (String.IsNullOrEmpty(title))
    
        MessageBox.Show("Error: The title field was left empty!");
        return;
    

    if (String.IsNullOrEmpty(description))
    
        MessageBox.Show("Error: The description field was left empty!");
        return;
    

    if (String.IsNullOrEmpty(place))
    
        MessageBox.Show("Error: The place field was left empty!");
        return;
    

    if (date < currentDate)
    
        MessageBox.Show("Error: The date must be in the future!");
        return;
    

    if (date == currentDate && time < currentTime)
    
        MessageBox.Show("Error: The time must be in the future!");
        return;
    

然后我有一个名为 AddReminderForm 的表单,它继承自 AddEditReminderForm。我正在覆盖 buttonSave_Click 事件处理程序,以便它除了在基类中执行的正常操作之外还保存提醒。以下是 AddReminderForm 的代码:

using System;
using System.Windows.Forms;
using Reminder.Classes;

namespace Reminder

    public partial class AddReminderForm : AddEditReminderForm
    
        public AddReminderForm()
        
            InitializeComponent();
            this.Text = "Add Reminder Form";

            Label labelFormHeading = this.Controls["labelFormHeading"] as Label;
            labelFormHeading.Text = "Add Reminder";
        

        protected override void buttonSave_Click(object sender, EventArgs e)
        
            base.buttonSave_Click(sender, e);
            AddReminderOperation();
        

        protected void AddReminderOperation()
        
            ReminderClass reminder = new ReminderClass();
            reminder.Id = ReminderHelper.GetCounter();
            reminder.Title = title;
            reminder.Description = description;
            reminder.Place = place;
            reminder.Date = date;
            reminder.Time = time;

            ReminderHelper.AddReminder(reminder);
            MessageBox.Show("The reminder has been successfully saved!");
            this.Close();
        
    

现在,我遇到的问题是,当 AddReminderForm 打开时,如果 PerformValidations 方法中的验证之一失败,则会显示消息框但执行并没有停止,提醒仍然保存。如果其中一项验证失败,我该如何中断执行?我正在使用return,但如果我没记错的话,return 只会停止当前方法的执行。谢谢。

【问题讨论】:

【参考方案1】:

我将在您的基类ValidateAndSave 中创建一个方法,从事件处理程序中调用它:

protected void ValidateAndSave()

    if (this.PerformValidations())
    
        this.Save();
    


private void buttonSave_Click(object sender, EventArgs e)

    this.ValidateAndSave();


protected bool PerformValidations()
    /* could be virtual, if you want to do additional checks in derived classes */
 ... 

protected virtual void Save()
 ... 

如果所有验证都正常,您让PerformValidations 返回true。然后调用 save,你可以在派生类中覆盖它。

【讨论】:

非常感谢您描述的方法。这很有道理。谢谢。

以上是关于Windows 窗体 - 如何中断当前正在执行的代码的执行的主要内容,如果未能解决你的问题,请参考以下文章

Windows窗体C#设计器文件中的“枚举”类型中断

如何在 Windows 窗体应用程序中获取 *** 用户的当前用户身份?

在运行的表单中打开不同的表单而不中断 !st 表单的执行

c#如何实现关闭当前窗体并打开另一个已经创建的窗体。

在 Windows 窗体的 HttpClient 类中使用 DelegatingHandler - 内部处理程序尚未设置

在 Windows 窗体中创建类似控制台的信息显示