Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Undo\Redo помогите разобраться


Автор: DenWPF 29.4.2011, 21:22
dejavu.codeplex.com - вот как я понимаю класс для автоматического использования Undo\Redo.

Пытался сделать самое простое, добавление\удаление из коллекции данных.

Создал простую модель данных.

Код

public class MyData
    {
        private string m_name;
        private Point m_location;

        public MyData(string name, Point location)
        {
            Name = name;
            Location = location;
        }

        public string Name
        {
            get { return m_name; }
            set { m_name = value; }
        }

        public Point Location
        {
            get { return m_location; }
            set { m_location = value; }
        }
    }


Создаю класс List

Код

    public class GraphicsList : UndoRedoList<MyData>
    {
        public static GraphicsList Load()
        {
            using (UndoRedoManager.Start("Init"))
            {
                GraphicsList cities = new GraphicsList();
                cities.Add(new MyData("R " + Form1.rand.Next(10, 100000).ToString(), new Point(Form1.rand.Next(10, 100), Form1.rand.Next(10, 100))));

                UndoRedoManager.ClearHistory();
                return cities;
            }
        }
        public static void Save()
        {
            throw new NotImplementedException();
        }
    }


в главном классе создаю поле\свойство

Код

private GraphicsList m_graphicsList = new GraphicsList();
public GraphicsList GraphicsList
        {
            get { return m_graphicsList; }
            set { m_graphicsList = value; }
        }


и два обработчика, нажатие на R (добавление нового элемента в коллекцию) и рисование объектов из коллекции.

Код

protected override void OnKeyDown(KeyEventArgs e)
        {
            if(e.KeyCode == Keys.R)
            {
                GraphicsList.Add(new MyData("R " + GraphicsList.Count.ToString(), new Point(rand.Next(10,100), rand.Next(10,100))));
            }
            this.Invalidate();
            base.OnKeyDown(e);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            foreach(var elem in GraphicsList)
            {
                g.DrawString(elem.Name, SystemFonts.CaptionFont, Brushes.Black, elem.Location);
            }
            base.OnPaint(e);
        }


При нажатии на R вылетает ошибка NullReferenceException (Ссылка на объект не указывает на экземпляр объекта.)
Хотя я не смог найти элемент в котором задано null.

Автор: Fortnox 29.4.2011, 23:19
Смотрите стек вызовов, из вашего сообщения не очень то понятно, где и что. Да и удивляет, зачем использовать в классе свойства, а не его, класса, переменные.

Автор: DenWPF 29.4.2011, 23:25
Цитата

зачем использовать в классе свойства, а не его, класса, переменные.


В дальнейшем нужно будет использовать свойства, для того что бы уведомлять что то о изменении...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)