【问题标题】:Changing the icon of ErrorProvider gives exception更改 ErrorProvider 的图标会产生异常
【发布时间】:2021-12-31 19:23:44
【问题描述】:

我正在尝试更改 Windowsform 中 errorProvider 的图标。我在 Properties->Resources 文件夹中添加了 .ico 文件。我试过直接复制粘贴 .ico 文件,也使用了 Add resources->Add Existing Files 选项。无论我做什么,如果我添加自己的 .ico 文件并尝试将它们设置为 errorProvider 图标,如下面的代码所示,我会在运行程序时遇到异常(特别是在尝试在我的程序中演示 errorProvider 功能时) .我的代码是:

 private void textBox1_Leave(object sender, EventArgs e)
        {
            if(string.IsNullOrEmpty(textBox1.Text))
            {
                textBox1.Focus();
                errorProvider1.Icon = Properties.Resources.cross; //here I have change the default icon
                errorProvider1.SetError(this.textBox1, "Input UserId"); //having exception in this line
            }
            else
            {
                errorProvider1.Icon = Properties.Resources.right;
            }
        }

异常详情:

System.StackOverflowException
  HResult=0x800703E9
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

【问题讨论】:

  • 尝试直接显示图标,独立于错误提供以消除未找到图标的原因。还要添加您看到的异常详细信息。
  • 非常感谢。我看到我的一位老师更改了他计算机中的 errorProvider 图标,并且效果很好(尽管我使用了相同的方法)。我将使用异常详细信息编辑我的帖子。再次感谢
  • 您为什么要首先尝试更改图标?该图标旨在突出显示有错误的框,并在验证失败时显示。通常验证发生在您提交表单时,但您也可以在控件失去焦点时触发它。这就是你试图通过处理Leave 来做的吗?
  • 至于异常本身,通常在您的代码导致无限递归时引发。也许你的代码一遍又一遍地触发Leave
  • 或者您是否尝试将 ErrorProvider 用作通用状态 UI?它不是。这个名字说明了一切——它是一个 ErrorProvider。

标签: c# visual-studio windows-forms-designer .net-framework-4.8 errorprovider


【解决方案1】:

通过Resource.resx添加资源也可以很好的参考ico。 Copy if new 是另一种调用方法。

添加现有资源:

leave 事件更改为Validating 事件可能会更好。

我已经测试了你的代码本身,没有问题。

我这里有reproduced the error,因为它是由ico file itself引起的。

换个图片即可解决。

The error document is here.

private void TextBox1_Validating(object sender, CancelEventArgs e) {
    if(string.IsNullOrEmpty(textBox1.Text)) {
            textBox1.Focus();
            errorProvider1.Icon=Properties.Resources.error__3_; //here I have change the default icon
            errorProvider1.SetError(textBox1, "Input UserId"); //having exception in this line
        } else {
            errorProvider1.Icon=Properties.Resources.yes1;
    }
}

您可以使用文件转换器转换为ico。

输出:

【讨论】:

  • 非常感谢!!你的解决方案奏效了。你能告诉我为什么使用验证而不是离开更好吗?
【解决方案2】:

首先将你的 ico 文件添加到资源中,并将“复制到输出目录”设置为始终复制

Copy to Outpot Directory Example

 private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if (textBox1.Text.Trim() == "") 
        {
            errorProvider1.SetError(textBox1, "ERROR WARNING");
            errorProvider1.Icon = new Icon(@"Resources\termicon.ico");
        }
            
        
    
    }

Example

【讨论】:

  • 对不起,我是新手。如何将“复制到输出目录”设置为始终复制。
  • 这里的重要变化是使用Validating 事件而不是Leave,而不是Copy to Output Directory。该错误不会抱怨丢失的文件。资源也不会复制到输出中,它们是可执行文件本身的一部分
  • 添加了图片来回答你可以检查一下。
  • op的错误不是图片调用的问题
  • @BuğraDemirtaş 谢谢你的照片。我已经尝试了您建议的所有步骤。但现在我得到一个新的异常: System.IO.DirectoryNotFoundException: '找不到路径的一部分'C:\Users\Mahin\Desktop\Nov21\LogInForm\bin\Debug\Resourcess\cross.ico'。'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多