Visual Studio выдает ошибку, когда я перетаскиваю свой пользовательский элемент управления в представление дизайна - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть два пользовательских элемента управления, один из которых представляет собой простой держатель изображения с флажком. И другой, который действует контейнером, чем имеет коллекцию предыдущего элемента управления.

Таким образом, HorizontalPictureScroller может иметь множество элементов управления SelectablePicture . Я вставлю небольшой код для каждого элемента управления:

Сначала HorizontalPictureScroller :

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
    }
}

Теперь элемент управления SelectablePicture :

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;

namespace WinformsPlayground
{
    [Serializable()]
    public partial class SelectablePicture : UserControl
    {
        public SelectablePicture()
        {
            InitializeComponent();
            panel1.BackgroundImageLayout = ImageLayout.Zoom;
        }

        public SelectablePicture(Image image)
        {
            panel1.BackgroundImage = image;
            panel1.BackgroundImageLayout = ImageLayout.Zoom;
        }

        #region "Properties"
        public Image Image()
        {
            return panel1.BackgroundImage;
        }

        public bool IsSelected()
        {
            return chkSelected.Checked;
        }
        #endregion

        #region "Methods"
        public void ToggleCheckBox()
        {
            chkSelected.Checked = chkSelected.Checked ? false : true;
        }

        public void VisuallySelect()
        {
            this.BackColor = Color.FromArgb(51, 153, 255);
        }

        public void VisuallyDeselect()
        {
            //If none of the controls inside the usercontrol have focus, set this control to white.
            if (!this.Focused && !this.panel1.Focused && !this.chkSelected.Focused)
            {
                this.BackColor = Color.White;
            }
        }        
        #endregion

        #region "Events"
        private void panel1_Click(object sender, EventArgs e)
        {
            VisuallySelect();
            ToggleCheckBox();
            panel1.Focus();
        }

        private void chkSelected_Click(object sender, EventArgs e)
        {
            VisuallySelect();
            ToggleCheckBox();
            chkSelected.Focus();
        }

        private void SelectablePicture_Click(object sender, EventArgs e)
        {
            VisuallySelect();
            ToggleCheckBox();
            this.Focus();
        }

        private void panel1_Leave(object sender, EventArgs e)
        {
            VisuallyDeselect();
        }

        private void chkSelected_Leave(object sender, EventArgs e)
        {
            VisuallyDeselect();
        }

        private void SelectablePicture_Leave(object sender, EventArgs e)
        {
            VisuallyDeselect();
        }
        #endregion        
    }
}

Вот снимок экрана с ошибкой, которую я получаю при перетаскивании HorizontalPictureScroller в мое представление дизайна Winform (извините, я не могу вставить текст здесь): alt text

Мои пользовательские элементы управления очень просты, и я не вижу, что происходит в коде.

Может быть, это грубая ошибка с моей стороны. : P Большое спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

Исключение выдается, потому что вы используете SerializableAttribute, а UserControl - нет.

Из документации на SerializableAttribute:

Общеязыковая среда выполнения выдает исключение SerializationException, если какой-либо тип в графе сериализуемых объектов не имеет примененного атрибута SerializableAttribute.

0 голосов
/ 29 ноября 2010

Похоже, что UserControl SelectablePicture необходимо сериализовать, потому что он используется в коллекции. Итак, вы были рядом с решением с атрибутом [Serializable ()]. Но вам лучше реализовать интерфейс ISerializable в вашем UserControl SelectablePicture

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

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

    #endregion
}

Это первый шаг к решению вашей проблемы. При этом у вас не будет сообщения об ошибке при перетаскивании вашего UserControl. Но теперь вам нужно управлять сериализацией.

Если кто-нибудь знает, зачем нужна сериализация, мне интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...