How to C# Component - tip

FpSpreadSheet4.0 Sheet의 데이터 및 스키마를 Save 및 Open 하기

 

1. 개요

[그림 1.Sheet의 데이터]

프로젝트를 진행 하다보면 Sheet의 데이터를 저장하였다가 프로그램 재 구동시 불러와야 할 경우가 있습니다.

제가 생각하는 방법은 2가지 입니다.

1. Sheet에 바인딩 되어있는 DataTable을 Serialize하여 txt나 xml로 저장 하였다가 Deserialize하여 가져온다.

2. FpSpreadSheet의 Save 메소드와 Open 메소드를 이용하여 xml로 관리한다.

두 번째 방법을 이용하면 Sheet의 스키마도 Save 및 Open 할 수 있으니 두 번째 방법으로 설명하겠습니다.

 

 

2. 얻을 수 있는 기술

    - FpSpreadSheet의 Save, Open

 

3. 사용할 Method 소개하기

    Save : Sheet의 데이터를 인코딩하여 파일로 저장합니다. (Sheet의 스키마도 저장가능)

    Open : Sheet의 데이터를 디코딩하여 Sheet에 불러옵니다. (Sheet의 스키마도 로드가능)

 

 

4. 프로그래밍 UI 디자인

단계1. 프로젝트 생성

[그림 2. 프로젝트 생성]

    

    단계2. Form UI 디자인하기

 

 

            [그림 3. Form UI 디자인하기-FormMain.cs]

 

 

 

 

 

        [그림 4. Form UI 디자인하기-FormTest1.cs]

 

 

 

 

5. 프로그래밍하기

     5.1 프로그래밍에 앞서 고민하기

         프로그램 규모가 작으면 당장엔 상관 없겠지만 점점 커지고 방대해 지다 보면 Sheet를 보여주는 Form이 1000개가 될 수 있습니다.

         메인 폼에서 다른 자식들의 폼을 1000개를 가지고 있는 List<Form> foms 필드가 있습니다.

        1000개의 폼에 존재하는 Sheet를 저장 및 로드를 해야 합니다. 1000개의 메소드를 일일이 호출 할 수는 없으니 Interface를 사용하였습니다.

 

 

     5.2 본격적으로 프로그래밍하기

          노하우를 효과적으로 전달하기 위하여 설계와 OOP 철학에 대한 부분은 생략하도록 하겠습니다.

         IExportAndImport Interface에 대해 먼저 설명하겠습니다. controlFileName은 Export, Import할 파일 이름입니다.

        Directory는 사용자에게 입력 받을 수 있기 때문에 파일 이름만 필드에 넣었습니다. Export는 Save, Import는 Open기능 입니다.

 

 

namespace AboutFarPointExportAndImport

{

/// <summary>

/// Export와 Import Interface

/// </summary>

interface IExportAndImport

{

/// <summary>

/// Export, Import 할 파일 이름

/// </summary>

string controlFileName { get; set; }

 

/// <summary>

/// Save

/// </summary>

/// <param name="filePath"></param>

void Export(string folderPath);

 

/// <summary>

/// Open

/// </summary>

/// <param name="filePath"></param>

void Import(string folderPath);

}

}

 

 

 

 

     각 폼은 IExportAndImport Interface를 상속 받아 구현합니다.

    Save 메소드의 2번째 인자는 데이터만 저장 할 것인지 Sheet의 스키마도 xml형식으로 저장 할 것인지 지정합니다.

    true일 경우 데이터만 false일경우 데이터+스키마 모두 저장합니다.

public partial class FormTest1 : Form, IExportAndImport

{

public FormTest1()

{

InitializeComponent();

InitTable();

}

 

#region IExportAndImport 멤버

 

public string controlFileName { get; set; }

 

public void Export(string filePath)

{

System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Create, System.IO.FileAccess.Write);

this.sheet.Save(fs, true);

fs.Close();

}

 

public void Import(string filePath)

{

System.IO.FileStream fs = System.IO.File.Open(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);

this.sheet.Open(fs);

fs.Close();

}

 

 

#endregion

 

}

 

.........

 

     FormMain의 동작을 설명하겠습니다.

     메인 폼은 List<Form> forms 라는 필드 하나를 가지고 있습니다. Load 할 때, Form 개체를 생성하고

        IExportAndImport의 필드인 controlFileName에 Save 및 Open할 파일 이름을 지정해줍니다.

 

public partial class FormMain : Form

{

/// <summary>

/// 생성한 Form

/// </summary>

List<Form> forms = null;

 

public FormMain()

{

InitializeComponent();

}

 

/// <summary>

/// Form Load할때

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void FormMain_Load(object sender, EventArgs e)

{

FormTest1 form1 = new FormTest1();

FormTest1 form2 = new FormTest1();

form1.controlFileName = "form1.xml";

form2.controlFileName = "form2.xml";

 

forms = new List<Form>();

forms.Add(form1);

forms.Add(form2);

}

......

 

      

 

 

     프로그램 구동 중에 Save를 하려고 Save 버튼을 눌렀을 시와 Load를 하려고 Load 버튼을 눌렀을 시입니다.

    자식 폼들이 또 자식 폼을 가지고 있다면, 해당 자식 Form의 Export 메소드를 구현 할 때,

    아래와 같은 구조로 작성하신다면 문제가 없을 것입니다.

 

/// <summary>

/// Export

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btn_save_Click(object sender, EventArgs e)

{

FolderBrowserDialog fb = new FolderBrowserDialog();

if (fb.ShowDialog() == DialogResult.OK)

{

for (int i = 0; i < this.forms.Count; i++)

{

IExportAndImport exportAndImportMember = this.forms[i] as IExportAndImport;

if (exportAndImportMember != null)

{

exportAndImportMember.Export(string.Format("{0}\\{1}", fb.SelectedPath, exportAndImportMember.controlFileName));

}

}

}

}

 

/// <summary>

/// Import

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btn_load_Click(object sender, EventArgs e)

{

FolderBrowserDialog fb = new FolderBrowserDialog();

if (fb.ShowDialog() == DialogResult.OK)

{

for (int i = 0; i < this.forms.Count; i++)

{

IExportAndImport exportAndImportMember = this.forms[i] as IExportAndImport;

if (exportAndImportMember != null)

{

exportAndImportMember.Export(string.Format("{0}\\{1}", fb.SelectedPath, exportAndImportMember.controlFileName));

}

}

}

}

 

 

 

 

How_to_-_FarPoint Sheet 저장 및 불러오기.docx

 

AboutFarPointExportAndImport.zip

 

+ Recent posts