728x90
반응형
728x170
▶ 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
반응형
그리드형(광고전용)
댓글을 달아 주세요