无法向表单添加控件

3
我正在尝试将一个UserControl添加到一个表单中。该UserControl在与表单不同的项目中,但在同一解决方案中。我以前已经将此控件添加到其他表单中,但是现在出了问题,我遇到了以下错误:
“创建组件MessageDisplayListControl失败。错误消息如下: 'System.Runtime.Serialization.SerializationException:程序集AceXtremeNET中的类型AceXtremeNET.Utilities.Message,版本=10.0.0.273……未标记为可序列化。在System.Runtime.Serialization.FormatterServices.InternalGetSerializableMember(RuntimeType type) at …. '”
控件确实被添加到.Designer.cs文件中,但它没有显示在GUI上。每次我尝试构建时,我都会得到多个错误,这些错误都基本相同,都指出'AceXtremeNET.Utilities.Message'不可序列化。
--------- 编辑 ------------------
我的控件有以下属性,这似乎是问题所在。
public IList<Message> MessageList {get{return _getList();} {set {_lostList(value);}}

这个属性并没有被代码所依赖,它只是作为一个get/set访问器而存在。当我注释掉这段代码时,一切似乎都正常工作。否则,我会遇到上面提到的错误。我之前在构建过程中也遇到了另一个错误,并且看起来这是唯一一个试图被序列化的属性。

--------- 编辑(堆栈跟踪)------------------

at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
at System.Runtime.Serialzation.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, SerializationBinder binder)
at System.Runtime.SerializationFormatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo)
...

--------- 编辑(控件属性)------------------

此功能允许您编辑所选控件的属性。您可以更改控件的名称,大小和位置等属性。通过编辑控件属性,您可以使控件在界面中更加符合您的需求。
请注意:在更改控件属性之前,请确保已保存您的工作。
public MessageControl MessageDisplay {get{return messageControl1;}} // This is another user control I created.  I've not had any problems with this control.
public MessageListBox {get { return listBox1; } }
public int MessageCount { get { return MessageListBox.Items.Count; }}
public bool ValidSelection { get { return (SelectedIndex >= 0 && SelectedIndex < MessageCount); } }
public Message SelectedMessage { get { return listBox1.SelectedItem as Message; } set { MessageDisplay.Message = Value; } }
public int SelectedIndex { get { return listBox1.SelectedIndex; } set { listBox1.SelectedIndex = value; } }

异常的堆栈跟踪是什么? - svick
@svick:我没有完整的堆栈跟踪,因为VS不会显示它。错误发生在设计时间(或构建时间当我尝试构建)而不是运行时。我将在原始帖子中添加不完整的堆栈跟踪。 - Neal
@Scott:AceXtremeNET项目中我没有使用任何被指定为[Serializable]的内容,所以看到这个错误很意外。我自己也不会尝试序列化任何东西。我会尝试添加这个属性并看看发生了什么。我会发布结果的。 - Neal
@Scott:看起来它确实可以工作。现在的问题是为什么它必须是可序列化的?我之前没有提到的一点是,我最近将Message类设置为ICloneable。不过我不确定这会导致什么错误。 - Neal
我已经将属性列表添加到原始帖子中。 - Neal
显示剩余5条评论
1个回答

6

阅读有关DesignerSerializationVisibility枚举的内容。

将此属性放在MessageList属性上。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

在这种情况下,设计师将无法在消息列表中捕捉到用户的变化,但如果您将其设置为

,则可以。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

设计师将在控件主机的Designer.cs中保存属性内容。

谢谢!我会仔细查看您提供的信息,并明天发布我的发现。另外,我添加了我的控件具有的属性列表。 - Neal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接