最近在进行代码合并的过程中, 遇到了 ImageList 控件运行到 SetKeyName 方法时, 提示 IndexOutOfRangeException 的情况. 也即是索引超出的异常. 分析设计器中图片数量, 以及断点调试, 发现设计界面中图片数量为 9, 实际运行时读取到的图片数量为 6, 导致, 后续 SetKeyName 的时候, 出现了超索引的问题.

解决思路:

  • 修复对应的 form 窗体的 resx 的资源文件
  • 排查是否改过 form 窗体多语言属性, 注意类似 en.resx,zh.resx 这些多语言的资源文件.

根本原因:

ImageList 会从 resx 资源文件中读取图片二进制的 base64 字串内容, 但是, 如果你设置了窗体的多语言, 也即是窗体的 language 属性, 那么, 也要对应的修改 zh.resx,en.resx 这些资源文件. 因为, 设计器界面默认只修改缺省的 resx 文件, 但是, 运行程序的时候, 会去读取对应的语言的 resx 资源文件. 所以, 删掉这些资源文件, 那么 ImageList 就会只从缺省的 Resx 文件中读取了.

总结:

写下这篇文章, 主要是网上能够查到的一些解决方案, 大多都没有说明其本质, 不能解决问题. 希望我的这篇文章能够解决和我遇到这个相同问题的朋友.

发表回复