UserControl无效.resx文件无法加载类型 - 需要设计时支持

时间:2016-08-04 10:06:54

标签: c# serialization deserialization resx

我正在尝试做什么:

我正在创建一个自定义控件,它将按照ListView(组和项)的方式工作。

控件具有组和组具有项目,因此可以先创建一个组,然后将一个或多个项目添加到该组(在该组属性下)。

问题:

当我尝试构建项目时,我遇到了这个错误:

  

无效的Resx文件。

     

无法加载.RESX文件中使用的类型Widget.ListCategory,Widget,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null。

     

确保已将必要的引用添加到项目中。第186行,第5位。小部件C:\ Users \ mb.ITHOZTING \ Dropbox \ Widget \ Widget \ Form1.resx 186

尝试修复项目:

我尝试了很多不同的东西,所以你必须原谅我,我不记得所有这些,但这些是我记得的:

  • 我尝试过实现ISerializer接口,对我的记忆没有做任何事情。

  • 我尝试删除.Resx文件中生成的代码,然后重新配置控件。没有帮助。

  • 我尝试用不同的标签标记不同的属性和类,例如[Serializable]。

代码

这是错误消息的罪魁祸首:

[Serializable]
class ListCategory : ListItemBase
{
    #region Properties
    private List<ListItem> items = new List<ListItem>();
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Editor(typeof(ListItemCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
    public List<ListItem> Items
    {
        get { return items; }
        set { items = value; }
    }
    #endregion
}

现在有相当多的文件和大量的代码,所以这是整个项目:https://www.dropbox.com/sh/zwz72dqm7vii78v/AACLjpy2DYZyQPxP_BBf0WTQa?dl=0

我应该采取哪些措施来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我可能已经找到了解决方案,但我并不是100%肯定,因为我觉得它有点不稳定(不是解决方案,而是问题),所以我不会将此标记为答案。< / p>

我必须做的是为每个给我提问的课程添加一个TypeConverter。

例如,第一个是ListCategory,然后其他类开始表现,然后我必须遵循相同的程序直到它起作用。

我将TypeConverter从两篇不同的文章中混合在一起,提供了丰富的设计时支持。

这些是链接:

  1. http://www.codeproject.com/Articles/9667/Creating-Custom-Controls-Providing-Design-Time-Sup
  2. http://www.codeproject.com/Articles/5502/Creating-Collection-Based-Controls-with-Rich-Desig
  3. 这是生成的TypeConverter:

    class GroupListConverter : TypeConverter
    {
        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
        {
            return TypeDescriptor.GetProperties(typeof(GroupList));
        }
    
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destType)
        {
            if (destType == typeof(InstanceDescriptor))
                return true;
    
            return base.CanConvertTo(context, destType);
        }
    
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
        {
            if (destType == typeof(InstanceDescriptor))
            {
                System.Reflection.ConstructorInfo ci = typeof(GroupList).GetConstructor(System.Type.EmptyTypes);
    
                return new InstanceDescriptor(ci, null, false);
            }
    
            return base.ConvertTo(context, culture, value, destType);
        }
    }