첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ CustomDiagramShape.cs

using DevExpress.Utils.Serializing;
using DevExpress.XtraDiagram;

namespace TestProject
{
    /// <summary>
    /// 커스텀 다이어그램 도형
    /// </summary>
    public class CustomDiagramShape : DiagramShape
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 데이터베이스 객체 ID - DatabaseObjectID

        /// <summary>
        /// 데이터베이스 객체 ID
        /// </summary>
        [XtraSerializableProperty]
        public int DatabaseObjectID { get; set; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Static

        #region 생성자 - CustomDiagramShape()

        /// <summary>
        /// 생성자
        /// </summary>
        static CustomDiagramShape()
        {
            DiagramControl.ItemTypeRegistrator.Register(typeof(CustomDiagramShape));
        }

        #endregion
    }
}

 

728x90

 

▶ DataObject.cs

namespace TestProject
{
    /// <summary>
    /// 데이터 객체
    /// </summary>
    public class DataObject
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region ID - ID

        /// <summary>
        /// ID
        /// </summary>
        public int ID { get; set; }

        #endregion
        #region 부모 ID - ParentID

        /// <summary>
        /// 부모 ID
        /// </summary>
        public int ParentID { get; set; }

        #endregion
        #region 컨텐트 - Content

        /// <summary>
        /// 컨텐트
        /// </summary>
        public string Content { get; set; }

        #endregion
    }
}

 

300x250

 

▶ MainForm.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;

using DevExpress.Diagram.Core;
using DevExpress.XtraEditors;
using DevExpress.XtraDiagram;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : XtraForm
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 다이어그램 파일명
        /// </summary>
        private const string DIAGRAM_FILE_NAME = "diagram.xml";

        /// <summary>
        /// 데이터 객체 리스트
        /// </summary>
        private List<DataObject> dataObjectList = new List<DataObject>();

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            DiagramStencil stencil = new DiagramStencil("CustomStencil", "Custom Shapes");

            FactoryItemTool itemTool = new FactoryItemTool
            (
                "CustomShape",
                () => "Custom Shape",
                diagram =>
                {
                    CustomDiagramShape customShape = new CustomDiagramShape()
                    {
                        Width  = 100,
                        Height = 50
                    };
                    
                    return customShape;
                },
                new System.Windows.Size(100, 50),
                false
            );

            stencil.RegisterTool(itemTool);

            DiagramToolboxRegistrator.RegisterStencil(stencil);

            DiagramControl.ItemTypeRegistrator.Register(typeof(CustomDiagramShape));

            this.dataObjectList.Add(new DataObject { ID = 1, ParentID = 0, Content = "Node 1"   });
            this.dataObjectList.Add(new DataObject { ID = 0,               Content = "Start"    });
            this.dataObjectList.Add(new DataObject { ID = 2, ParentID = 1, Content = "Node 1_1" });
            this.dataObjectList.Add(new DataObject { ID = 3, ParentID = 0, Content = "Node 2"   });
            this.dataObjectList.Add(new DataObject { ID = 4, ParentID = 3, Content = "Node 2_1" });

            this.diagramControl.CustomGetEditableItemProperties += diagramControl_CustomGetEditableItemProperties;
            this.diagramControl.ShowingEditor                   += diagramControl_ShowingEditor;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Protected

        #region 로드시 처리하기 - OnLoad(e)

        /// <summary>
        /// 로드시 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if(!File.Exists(DIAGRAM_FILE_NAME))
            {
                CreateDiagram();
            }
            else
            {
                LoadDiagram();
            }
        }

        #endregion
        #region 닫을 경우 처리하기 - OnClosing(e)

        /// <summary>
        /// 닫을 경우 처리하기
        /// </summary>
        /// <param name="e">이벤트 인자</param>
        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);

            this.diagramControl.SaveDocument(DIAGRAM_FILE_NAME);
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 다이어그램 컨트롤 편집 가능한 항목 속성 커스텀 구하기 - diagramControl_CustomGetEditableItemProperties(sender, e)

        /// <summary>
        /// 다이어그램 컨트롤 편집 가능한 항목 속성 커스텀 구하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void diagramControl_CustomGetEditableItemProperties(object sender, DiagramCustomGetEditableItemPropertiesEventArgs e)
        {
            if(e.Item is CustomDiagramShape)
            {
                e.Properties.Add(TypeDescriptor.GetProperties(typeof(CustomDiagramShape))["DatabaseObjectID"]);
            }
        }

        #endregion
        #region 다이어그램 컨트롤 에디터 표시시 처리하기 - diagramControl_ShowingEditor(sender, e)

        /// <summary>
        /// 다이어그램 컨트롤 에디터 표시시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void diagramControl_ShowingEditor(object sender, DiagramShowingEditorEventArgs e)
        {
            e.Cancel = true;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 다이어그램 생성하기 - CreateDiagram()

        /// <summary>
        /// 다이어그램 생성하기
        /// </summary>
        private void CreateDiagram()
        {
            foreach(DataObject dataObject in this.dataObjectList)
            {
                CustomDiagramShape shape = new CustomDiagramShape
                {
                    Shape            = BasicShapes.Rectangle,
                    Size             = new Size(150, 100),
                    DatabaseObjectID = dataObject.ID,
                    Content          = dataObject.Content
                };

                this.diagramControl.Items.Add(shape);

                if(dataObject.ParentID != dataObject.ID)
                {
                    diagramControl.Items.Add
                    (
                        new DiagramConnector
                        {
                            BeginItem = diagramControl.Items.First
                            (
                                x => x is CustomDiagramShape && ((CustomDiagramShape)x).DatabaseObjectID == dataObject.ParentID
                            ),
                            EndItem = shape
                        }
                    );
                }
            }

            this.diagramControl.ApplyTreeLayout(Direction.Right);
        }

        #endregion
        #region 다이어그램 로드하기 - LoadDiagram()

        /// <summary>
        /// 다이어그램 로드하기
        /// </summary>
        private void LoadDiagram()
        {
            try
            {
                this.diagramControl.LoadDocument(DIAGRAM_FILE_NAME);

                foreach(DiagramItem item in diagramControl.Items)
                {
                    CustomDiagramShape shape = item as CustomDiagramShape;

                    DataObject dataObject;

                    if(shape != null)
                    {
                        dataObject = this.dataObjectList.FirstOrDefault(x => x.ID == shape.DatabaseObjectID);

                        shape.Content = (dataObject == null) ? null : dataObject.Content;
                    }
                }
            }
            catch
            {
                CreateDiagram();
            }
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)

'DevExpress > WinForm' 카테고리의 다른 글

[DEVEXPRESS/WINFORM] DiagramControl 클래스 : CustomGetEditableItemProperties 이벤트를 사용해 속성 패널에 바인딩 데이터 소스 속성 추가하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramControl 클래스 : CustomGetEditableItemProperties 이벤트를 사용해 속성 패널에 파생 도형 속성 추가하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramControl 클래스 : CustomGetEditableItemProperties 이벤트를 사용해 속성 패널에 속성 추가하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramStencil 클래스 : RegisterTool 메소드를 사용해 스텐실에 커스텀 다이어그램 항목 추가하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramControl 클래스 : 커스텀 다이어그램 컨테이너 생성하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramControl 클래스 : CustomDrawItem 이벤트를 사용해 다이어그램 항목 내 커스텀 아이콘 그리기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] ImageResourceCache 클래스 : GetImage 메소드를 사용해 DEVEXPRESS 이미지 구하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramControl 클래스 : 커스텀 그래프 레이아웃 알고리즘 사용하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramControl 클래스 : 연결 포인트를 갖는 커스텀 도형 생성하기  (0) 2020.06.07
[DEVEXPRESS/WINFORM] DiagramControl 클래스 : 자기 참조 데이터 소스에서 다이어그램 생성하기  (0) 2020.06.06
Posted by icodebroker

댓글을 달아 주세요