山西念星科贸有限公司 2024-06-03 10:29 采纳率: 72%
浏览 4
已结题

有一个方法里面创建了一个窗体,并创建了一个按钮,按钮有一个点击事件,我调用这个方法运行出一个窗口后点击按钮通过断点发现按钮点击事件后的代码根本没有执行,这是为什么呢,该怎么解决呢?

问题遇到的现象和发生背景

有一个方法里面创建了一个窗体,并创建了一个按钮,按钮有一个点击事件,我调用这个方法运行出一个窗口后点击按钮通过断点发现按钮点击事件后的代码根本没有执行,这是为什么呢,该怎么解决呢?

用代码块功能插入代码
 public static (int imageWidth, int imageHeight) TakeTheSizeOfTheImage(string imageFilePath)
 {//试运行代码,如果没有问题运行try代码块内容
     try
     {//实例化一个图像类,并命名为:图像,并赋值为从图像路径打开的图像
         using (Image image = Image.FromFile(imageFilePath))
         {// 声明一个整数型局部变量,名字是图片宽,并赋值为获取到的图片的宽
             int imageWidth = image.Width;
             //声明一个整数型局部变量,名字是图片高,并赋值为获取到的图片的高
             int imageHeight = image.Height;
             //返回图片的宽和图片的高
             return (imageWidth, imageHeight);
         }
     }//有异常,运行catch代码块内容,errorMessage参数是错误文本,用来存储错误内容
     catch (Exception errorMessage)
     {//弹出一个窗口名称是温馨提示的窗口,内容是:获取图片数据失败,请联系公司技术部人员,联系方式:18935139074,换行,错误内容
         MessageBox.Show("获取图片数据失败,请联系公司技术部人员,联系方式:18935139074" + "\r\n" + errorMessage.Message + "\r\n" + errorMessage, "温馨提示");
         //抛出异常停止执行方法
         throw;
     }
 }
public static bool CreateASuitableNewWindowWithAnImageBoxInsideItBasedOnTheObtainedImageSize(string imageFilePath)
{ 
    //声明一个推断类型局部变量,并命名为:大小,并赋值为:图片操作类中的打开一个图片并获取图片的大小(宽和高)的返回值
    var size = ImageOperation.TakeTheSizeOfTheImage(imageFilePath);
    //声明一个整形局部变量,并命名为宽,并赋值为获取到的图片的宽
    int Width = size.imageWidth;
    //声明一个整形局部变量,并命名为高,并赋值为获取到的图片的高
    int Height = size.imageHeight;
    //声明一个布尔型的局部变量,并命名为:结果,并命名为结果
    bool value=false;
    //实例化一个新窗体,并命名为:窗体
    Form form = new Form()
    {//设置窗体的大小为:(获取到的图片的宽+50,获取到的图片的高+100)
        Size = new Size(Width + 50, Height + 150),
        //设置窗体的窗体名为:您选择的图片是:
        Text = "您选择的图片是:",
    };//将窗体显示出来
    form.Show();
    //实例化一个新图片框,并命名为:图片框
    PictureBox pictureBox = new PictureBox()
    { //设置图片框的大小为:(获取到的图片的宽+20,获取到的图片的高+20)
        Size = new Size(Width + 20, Height + 20),
        //设置图片框的位置为:(1010)
        Location = new Point(10, 10),
        //设置图片框的图片为获取到的图片
        Image = Image.FromFile(imageFilePath),
    }; //将图片框添加进窗体中
    form.Controls.Add(pictureBox);
    //声明一个布尔型的局部变量,命名为:取消选择按钮点击,并赋值为:假
    bool deselectButtonClicked = false;
    //实例化一个新的按钮,并命名为:取消按钮
    Button deselectButton = new Button()
    { //设置确认按钮的大小为:(获取到的图片的宽-50的值再除以250)
        Size = new Size((Width) / 2, 50),
        //设置窗体的位置为:(1010)
        Location = new Point(((Width) / 2) + 20, Height + 30),
        //设置按钮的显示名为:取消选择
        Text = "取消选择",
    };//为取消选择按钮添加一个点击事件
    deselectButton.Click += (sender, args) =>
    {//声明一个新的对话框返回结果枚举变量,命名为结果,并赋值为:打开一个带确认、取消的消息框,内容是:确定选择当前文件吗,窗体名是:温馨提示
        DialogResult result = MessageBox.Show("确定取消选择当前文件吗", "温馨提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
        //判断用户点的是否是确认按钮
        if (result == DialogResult.OK)
        {//如果用户点的是确认按钮,将局部变量结果的值赋值为:真
            value = true;
            //将局部变量取消选择按钮点击重新赋值为:真
            deselectButtonClicked = true;
        }--------------------------------就是这里我通过断点发现当取消选择按钮点击后就不往下执行了
    };
    //将取消选择按钮添加进窗体中
    form.Controls.Add(deselectButton);
    //声明一个布尔型的变量,并命名为:确认按钮点击,并赋值为:假
    bool confirmButtonClicked=false;
    //实例化一个新的按钮,并命名为:确认按钮
    Button confirmButton = new Button()
    { //设置确认按钮的大小为:(获取到的图片的宽-50的值再除以250)
        Size = new Size((Width) / 2, 50),
        //设置窗体的位置为:(1010)
        Location = new Point(10, Height + 30),
        //设置按钮的显示名为:确认选择
        Text = "确认选择",
    };//为确认选择按钮添加一个点击事件
    confirmButton.Click += (sender, args) =>
    {//声明一个新的对话框返回结果枚举变量,命名为结果,并赋值为:打开一个带确认、取消的消息框,内容是:确定选择当前文件吗,窗体名是:温馨提示
        DialogResult result = MessageBox.Show("确定选择当前文件吗", "温馨提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
        //判断用户点的是否是确认按钮
        if (result == DialogResult.OK)
        {//如果用户点的是确认按钮,将局部变量结果的值赋值为真
            value = true;
            //将局部变量确认选择按钮点击重新赋值为真
            confirmButtonClicked = true;
            //打开一个消息框,内容是:选择文件成功!!!,窗体名是:温馨提示
            MessageBox.Show("选择文件成功!!!", "温馨提示");
        }
    };//将确认选择按钮添加进窗体中
    form.Controls.Add(confirmButton);
    //判断用户是否点击了确认按钮或者取消按钮
    if (confirmButtonClicked == false || deselectButtonClicked == false)
    {//如果用户既没有点击确认按钮,也没有点击取消按钮,那么为窗体添加新的关闭事件,并调用关于窗口操作类中的禁止用户关闭窗体方法
        form.FormClosing += new FormClosingEventHandler(FromOperation.QuietUserClosesForm);
    }//如果用户点击了确认按钮或者取消按钮
    else
    {//为窗体添加新的关闭事件,并调用关于窗口操作类中的允许用户关闭窗体方法
        form.FormClosing += new FormClosingEventHandler(FromOperation.AllowCustomersToCloseForms);
        //关闭窗体
        form.Close();
    }
    //返回结果的值
    return value;
}

运行结果及详细报错内容

取消选择按钮点击后后续代码不执行

我想要达到的结果

取消选择按钮点击后后续代码还要执行

  • 写回答

8条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-06-03 10:53
    关注

    🕖上午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:昂首千丘远,啸傲风间。堪寻敌手共论剑,高处不胜寒。

    问题的原因很可能是窗体关闭事件 (FormClosing) 的处理方式导致的。

    问题分析

    在你的代码中,当用户点击“取消选择”按钮并确认后,deselectButtonClicked 会被设置为 true,然后代码会继续执行到 if (confirmButtonClicked == false || deselectButtonClicked == false)。由于此时 deselectButtonClicked 已经是 true,所以条件不满足,代码会进入 else 分块。

    else 分块中,你为窗体添加了 FormClosing 事件,并调用 FromOperation.AllowCustomersToCloseForms 方法。如果 FromOperation.AllowCustomersToCloseForms 方法中关闭了窗体,那么后续代码就不会执行了。

    解决方案

    为了解决这个问题,你需要修改代码逻辑,确保在处理完按钮点击事件后,窗体不会被立即关闭。

    以下是几种可能的解决方案:

    1. 不要在按钮点击事件中关闭窗体:

      • form.Close()else 分块中移除。
      • 修改 FromOperation.AllowCustomersToCloseForms 方法,使其不关闭窗体,而是设置一个标志,指示允许关闭窗体。
      • FormClosing 事件中,检查标志是否被设置,如果是,则允许关闭窗体。
    2. 使用对话框模式显示窗体:

      • form.Show() 改为 form.ShowDialog()
      • 使用对话框模式时,窗体将会阻塞主线程,直到用户关闭它。
      • 你需要修改代码,在用户点击按钮并确认后,设置一个标志来指示结果,然后关闭窗体。
      • 在调用 form.ShowDialog() 之后,根据标志的值来确定用户的选择。
    3. 使用异步方法处理按钮点击事件:

      • 将按钮点击事件处理程序改为异步方法。
      • 在异步方法中,使用 await 关键字等待用户确认。
      • 用户确认后,继续执行后续代码。

    示例代码 (使用对话框模式):

    public static bool CreateASuitableNewWindowWithAnImageBoxInsideItBasedOnTheObtainedImageSize(string imageFilePath)
    {
        // ... (其他代码)
    
        // 使用对话框模式显示窗体
        DialogResult dialogResult = form.ShowDialog();
    
        // 根据对话框结果确定用户的选择
        if (dialogResult == DialogResult.OK)
        {
            // 用户点击了确认按钮
            value = true;
            MessageBox.Show("选择文件成功!!!", "温馨提示");
        }
        else if (dialogResult == DialogResult.Cancel)
        {
            // 用户点击了取消按钮
            value = false;
        }
    
        return value;
    }
    
    // 取消选择按钮点击事件处理程序
    deselectButton.Click += (sender, args) =>
    {
        // 关闭窗体,并将 DialogResult 设置为 Cancel
        form.DialogResult = DialogResult.Cancel;
    };
    
    // 确认选择按钮点击事件处理程序
    confirmButton.Click += (sender, args) =>
    {
        // 显示确认消息框
        DialogResult result = MessageBox.Show("确定选择当前文件吗", "温馨提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    
        // 如果用户点击了确认按钮,则关闭窗体,并将 DialogResult 设置为 OK
        if (result == DialogResult.OK)
        {
            form.DialogResult = DialogResult.OK;
        }
    };
    

    请根据你的实际需求选择合适的解决方案。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月6日
  • 已采纳回答 6月3日
  • 赞助了问题酬金15元 6月3日
  • 创建了问题 6月3日

悬赏问题

  • ¥15 SPSS分类模型实训题步骤
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的
  • ¥15 我看了您的文章,遇到了个问题。