C# 当我将用户控件拖到“设计”视图上时,Visual Studio引发错误

C# 当我将用户控件拖到“设计”视图上时,Visual Studio引发错误,c#,winforms,user-controls,C#,Winforms,User Controls,我有两个用户控件,一个是带有复选框的简单图片夹。另一个作为容器,而不是具有前一个控件的集合 因此,一个水平图片滚动条可以有许多可选择的图片控件。我将为每个控件粘贴小代码: 首先,水平图片滚动: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Tex

我有两个用户控件,一个是带有复选框的简单图片夹。另一个作为容器,而不是具有前一个控件的集合

因此,一个水平图片滚动条可以有许多可选择的图片控件。我将为每个控件粘贴小代码:

首先,水平图片滚动:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;

namespace WinformsPlayground
{
    [Serializable()]
    public partial class HorizontalPictureScroller : UserControl
    {
        public HorizontalPictureScroller()
        {
            InitializeComponent();
            Pictures = new ObservableCollection<SelectablePicture>();
            Pictures.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Pictures_CollectionChanged);
        }       

        #region "Properties"
        public ObservableCollection<SelectablePicture> Pictures { get; set; }
        private int PositionControlX = 0;
        #endregion

        #region "Methods"
        private void RedrawPictures()
        {
            PositionControlX = 0;

            foreach (var picture in Pictures)
            {
                picture.Location = new Point(PositionControlX + panelPicturesWrapper.AutoScrollPosition.X, 0);
                PositionControlX += 130;
                panelPicturesWrapper.Controls.Add(picture);
            }
        }

        public void AddPicture(SelectablePicture picture)
        {
            Pictures.Add(picture);
        }

        public void RemovePicture(SelectablePicture picture)
        {
            Pictures.Remove(picture);
        }

        public void MovePictureLeft(int index)
        {
            SelectablePicture tmpPicture = Pictures[index];
            Pictures[index] = Pictures[index - 1];
            Pictures[index - 1] = tmpPicture;
        }

        public void MovePictureRight(int index)
        {
            SelectablePicture tmpPicture = Pictures[index];
            Pictures[index] = Pictures[index + 1];
            Pictures[index + 1] = tmpPicture;
        }
        #endregion

        #region "Events"
        void Pictures_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            RedrawPictures();
        }        
        #endregion
    }
}
以下是我尝试将HorizontalPictureScroller拖到Winform design视图时遇到的错误截图(很抱歉,我无法将文本粘贴到此处):

我的用户控件非常简单,我看不出代码中出了什么问题


也许这是我的一个明显错误P非常感谢您的时间。

由于您正在使用,因此引发异常,但是

UserControl
没有

SerializableAttribute
的文档中:

如果要序列化的对象图中的任何类型未应用SerializableAttribute属性,公共语言运行库将引发SerializationException


似乎需要序列化UserControl SelectablePicture,因为它在集合中使用。因此,您与属性为[Serializable()]的解决方案非常接近。但您最好在UserControl SelectablePicture中实现ISerializable接口

public partial class SelectablePicture : UserControl, ISerializable
{
    #region ISerializable Membres

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        ...
    }

    #endregion
}
这是解决问题的第一步。这样,当您拖放UserControl时就不会出现错误消息。但是现在您必须管理序列化


如果有人知道为什么需要序列化,我很感兴趣。

即使我删除了[Serializable()]的标题,我仍然会得到那个错误。事实上,我添加它只是因为有人说这是错误的原因:P还有其他想法吗?谢谢@Serg,当您删除
[Serializable()]
并分别添加每个控件时,它们是否都会引发异常?如果只有
HorizontalPictureScroller
抛出异常,问题可能是它使用的
ObservableCollection
,因为它被标记为
Serializable
@adrift:耶!当我将异常拖动到designer视图时,只有HorizontalPictureScroller触发该异常。关于如何解决这个问题有什么建议吗?@Serg,我尝试了一些方法,问题似乎是
observeCollection
Serializable
,但是
SelectablePicture
不是,不幸的是,你不能将它标记为
Serializable
,因为它继承自
UserControl
。注意,这并不特定于
可观察采集
可选择图片
;如果将其更改为
List
,其中
Foo
不可
Serializable
,则会出现相同的异常。有没有什么方法可以更改您的设计,使
可观测集合
属于某种类型,可以
序列化
?@adrift:感谢您花时间提供帮助!:我之所以使用ObservableCollection,是因为我想在每次修改集合中的某些内容时激发一个方法。你有没有别的建议?谢谢2.
public partial class SelectablePicture : UserControl, ISerializable
{
    #region ISerializable Membres

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        ...
    }

    #endregion
}