달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'Study/DevExpress'에 해당되는 글 4

  1. 2012.11.23 XtraGrid - Group Merge
  2. 2012.09.21 Grid Layout Save & Load
  3. 2012.08.22 XtraGrid - Export Excel File Open
  4. 2012.07.31 XtraGrid - Find Panel
2012. 11. 23. 09:39

XtraGrid - Group Merge Study/DevExpress2012. 11. 23. 09:39

Group Merge

Merge에 대한 간단한 팁입니다.

DevExpress XtraGrid뿐만 아니라 거의 대부분의 그리드에서 Cell Merge 기능을 제공하고 있습니다.

 

XtraGrid에서 Merge를 설정하는 방법은 다음과 같습니다

1.먼저 Views Options중에 OptionsView 항목중에서 AllowCellMerge True로 설정합니다.



2.각 컬럼에서 1에서 설정한 속성을 따르지 않는 컬럼만 별도로 설정하고 나머지는 Default로 둡니다(Columns->Options->OptionsColumn 항목에 있습니다)


하지만 이 Merge 기능에는 불편한 점이 하나 있는데 아마 한 번쯤은 다들 겪어보셨으리라 생각합니다.

각 컬럼별로 독립적으로 Megre를 하다보니 트리구조의 Merge가 되지 않는다는 것입니다.

상위 항목에 따라서 하위 컬럼들이 Merge가 되면 좋겠는데 이게 잘 안된다는 것이죠(저는 Group Merge라고 이름을 붙였습니다).

아래 그림을 보면 이해가 더 쉬우리라 생각합니다.

이 그림은 흔히 볼 수 있는 Merge화면입니다.

Order 번호 별로 각 차수가 있고 Order 별 상태와 Order Branch가 있습니다.

원래 의도는 Order별로 Merge를 하려는 것이었는데, 컬럼별 Merge속성을 주다보니 Order번호와는 관계없이 같은 값을 가지면 전부 Merge가 되어 버립니다.

 

우리가 원하는 형태의 그림은 아래와 같습니다.


이 그림은 오더번호를 기준으로 하위 컬럼들이 Merge된 형태입니다.

제가 찾아본 바로는 XtraGrid에서 바로 지원하는 속성은 없는 듯 싶습니다(물론 제가 찾지 못했을 수도 있습니다).

그래서 결국 코딩으로 구현했습니다.

 

그 코딩은 아래와 같습니다.

 

    Private Sub GV1_CellMerge(sender As System.Object, e As DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs) Handles GV1.CellMerge

        Select Case e.Column.FieldName

            Case "Sts. Column Name", "Branch Column Name "

                Dim view As DevExpress.XtraGrid.Views.Grid.GridView = CType(sender, DevExpress.XtraGrid.Views.Grid.GridView)

                Dim val1 As String = view.GetRowCellValue(e.RowHandle1, "Order No Column Name")

                Dim val2 As String = view.GetRowCellValue(e.RowHandle2, " Order No Column Name ")

                e.Merge = (val1 = val2)

                e.Handled = True

            Case Else

        End Select

    End Sub

 

내용은 간단합니다.

GV1.CellMerge는 그리드에서 Merge가 발생할 때 일어나는 이벤트입니다.

Merge가 발생하는 컬럼이 내가 원하는 컬럼이고 기준이 되는 컬럼(여기서는 Order No)의 값이 같으면 Merge를 실행하도록 하는 코딩입니다.

 

이렇게 함으로써 원하는 컬럼에 대해서 원하는 방식으로 Merge를 할 수 있습니다.

오늘은 이상입니다.

:
Posted by 하늘바램
2012. 9. 21. 09:30

Grid Layout Save & Load Study/DevExpress2012. 9. 21. 09:30

이번에는 Grid Layout Save Load에 대해서 알아보겠습니다.

이 기능은 DevExpress Component에서 지원하는 기능을 YJIT Framework Grid Properties로 추가해서 쉽게 사용할 수 있도록 만들었습니다.

 

먼저 사용방법을 보도록 하겠습니다.

 

우선 Grid SaveLayout properties True로 설정합니다.

 

이것으로 설정은 끝입니다.

 

이렇게 하고 컴파일 한 후 프로그램을 실행하면 겉으로 보기에는 아무런 변화가 없지만, Grid가 포함된 화면을 닫을 때, 현재 Grid에 대한 Layout을 저장합니다.

저장되는 경로는 프로그램 실행파일이 있는 경로에 GridLayout이라는 Folder를 생성하고 그 안에 2개의 파일을 생성합니다.

생성되는 두 개의 파일 명은 다음과 같습니다.

1.     Grid가 포함된 Form Name + 그리드 View 이름 + ‘_ORIGIN’ : 처음에 디자인된 Grid Layout File

2.     Grid가 포함된 Form Name + 그리드 View 이름 : 최종 저장된 Grid Layout File

GridLayout Folder

이런식으로 파일이 생성됩니다.

 

Grid Layout을 불러오는 시점은 Grid OnCreateControl( ) 함수이고, 최종 Layout을 저장하는 시점은 Dispose( ) 함수입니다.

 

아래 그림은 Grid변경의 예시입니다.

 

최초 Grid의 모습입니다.

 

최초 Grid에서 첫번째 컬럼을 Hide 하고 Type Contract Date를 앞으로 옮기고, Contract Date Sort를 지정하고 BranchGroup을 걸고 확인한 결과 이 상태가 그대로 저장되었습니다.


 

최초 xml 파일과 저장된 xml 파일은 맨 마지막에 따로 적도록 하겠습니다. 참고하십시오.

  

이 방법의 단점은 개발자가 새로 Grid를 수정해서 배포했을 경우, 사용자는 계속 마지막에 저장된 형태의 Grid Layout으로만 보인다는 단점이 있습니다.

그래서 최초 배포시에 디자인된 Layout으로 되돌리는 기능이 필요합니다.

처음 디자인된 Grid Layout으로 되돌리려면 Grid Header에서 마우스 오른쪽 클릭을 합니다.

그러면 아래 그림과 같은 Popup Menu가 뜨는데 맨 아래 보면 Layout Reset이라는 메뉴가 추가로 생성되어 있음을 볼 수 있습니다.


 

Layout Reset을 누르면 확인 창이 뜨고

 

OK를 누르면 원래의 Layout으로 돌아갑니다. 이전에 저장된 Grid Layout으로 돌아갈 수 없습니다.

 이 방법은 xml 파일로 Client에 저장되는 방식이기 때문에 사용자가 아니라 컴퓨터마다 다른 Layout이 나올 수 있습니다.

이것을 사용자별로 Layout을 적용하도록 하려면 xml 파일이 아니라 DataBase xml 파일 내용을 저장하고 불러오는 방식을 사용해야 할 것입니다.

하지만 아직은 검증도 안된 상태이고 그렇게 하면 속도문제도 있을 것 같아서 현재는 Client에 저장하는 방식만을 사용하고 있습니다.

 

이상으로 Grid Layout Save & Load를 알아보았습니다.

 

참고 링크 : http://documentation.devexpress.com/#WindowsForms/CustomDocument2404

 

참고로 DevExpress에서는 위와 같은 방식으로 Grid 뿐만 아니라 Form 자체의 Layout을 저장하는 방법도 제공하고 있습니다.

 

별첨. Grid Layout xml 파일 내용.

1. TmsVehChassisGV1_ORIGIN

<XtraSerializer version="1.0" application="View">

  <property name="#LayoutVersion" />

  <property name="ActiveFilterEnabled">true</property>

  <property name="Columns" iskey="true" value="10">

    <property name="Item1" isnull="true" iskey="true">

      <property name="Visible">true</property>

      <property name="VisibleIndex">0</property>

      <property name="Name">GridColumn1</property>

    </property>

    <property name="Item2" isnull="true" iskey="true">

      <property name="Width">107</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">1</property>

      <property name="Name">GridColumn2</property>

    </property>

    <property name="Item3" isnull="true" iskey="true">

      <property name="Visible">true</property>

      <property name="VisibleIndex">5</property>

      <property name="Name">GridColumn9</property>

    </property>

    <property name="Item4" isnull="true" iskey="true">

      <property name="Visible">true</property>

      <property name="VisibleIndex">2</property>

      <property name="Name">GridColumn3</property>

    </property>

    <property name="Item5" isnull="true" iskey="true">

      <property name="Width">116</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">3</property>

      <property name="Name">GridColumn5</property>

    </property>

    <property name="Item6" isnull="true" iskey="true">

      <property name="Width">223</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">4</property>

      <property name="Name">GridColumn6</property>

    </property>

    <property name="Item7" isnull="true" iskey="true">

      <property name="Width">206</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">6</property>

      <property name="Name">GridColumn4</property>

    </property>

    <property name="Item8" isnull="true" iskey="true">

      <property name="Width">115</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">7</property>

      <property name="Name">GridColumn7</property>

    </property>

    <property name="Item9" isnull="true" iskey="true">

      <property name="Width">121</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">8</property>

      <property name="Name">GridColumn8</property>

    </property>

    <property name="Item10" isnull="true" iskey="true">

      <property name="Width">62</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">9</property>

      <property name="Name">GridColumn10</property>

    </property>

  </property>

  <property name="OptionsView" isnull="true" iskey="true">

    <property name="ShowGroupPanel">false</property>

    <property name="ShowViewCaption">true</property>

    <property name="EnableAppearanceEvenRow">true</property>

    <property name="ColumnAutoWidth">false</property>

  </property>

  <property name="ActiveFilterString" />

  <property name="GroupSummarySortInfoState" />

</XtraSerializer>

 

 

 

 

 

2. TmsVehChassisGV1

<XtraSerializer version="1.0" application="View">

  <property name="#LayoutVersion" />

  <property name="ActiveFilterEnabled">true</property>

  <property name="Columns" iskey="true" value="10">

    <property name="Item1" isnull="true" iskey="true">

      <property name="Name">GridColumn1</property>

    </property>

    <property name="Item2" isnull="true" iskey="true">

      <property name="Width">107</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">0</property>

      <property name="Name">GridColumn2</property>

    </property>

    <property name="Item3" isnull="true" iskey="true">

      <property name="Visible">true</property>

      <property name="VisibleIndex">1</property>

      <property name="Name">GridColumn9</property>

    </property>

    <property name="Item4" isnull="true" iskey="true">

      <property name="Visible">true</property>

      <property name="VisibleIndex">3</property>

      <property name="Name">GridColumn3</property>

    </property>

    <property name="Item5" isnull="true" iskey="true">

      <property name="Width">116</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">3</property>

      <property name="Name">GridColumn5</property>

    </property>

    <property name="Item6" isnull="true" iskey="true">

      <property name="Width">137</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">4</property>

      <property name="Name">GridColumn6</property>

    </property>

    <property name="Item7" isnull="true" iskey="true">

      <property name="Width">84</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">5</property>

      <property name="Name">GridColumn4</property>

    </property>

    <property name="Item8" isnull="true" iskey="true">

      <property name="Width">115</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">6</property>

      <property name="Name">GridColumn7</property>

    </property>

    <property name="Item9" isnull="true" iskey="true">

      <property name="Width">121</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">2</property>

      <property name="Name">GridColumn8</property>

    </property>

    <property name="Item10" isnull="true" iskey="true">

      <property name="Width">62</property>

      <property name="Visible">true</property>

      <property name="VisibleIndex">7</property>

      <property name="Name">GridColumn10</property>

    </property>

  </property>

  <property name="OptionsView" isnull="true" iskey="true">

    <property name="ShowGroupPanel">false</property>

    <property name="ShowViewCaption">true</property>

    <property name="EnableAppearanceEvenRow">true</property>

    <property name="ColumnAutoWidth">false</property>

  </property>

  <property name="ActiveFilterString" />

  <property name="SortInfo">~Xtra#Base64AAEAAAD/////AQAAAAAAAAAMAgAAAF5EZXZFeHByZXNzLlh0cmFHcmlkLnYxMS4xLCBWZXJzaW9uPTExLjEuMTEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iODhkMTc1NGQ3MDBlNDlhBQEAAAA4RGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mb0NvbGxlY3Rpb24EAAAACmdyb3VwQ291bnQFY2xvbmUPY2xvbmVHcm91cENvdW50E0NvbGxlY3Rpb25CYXNlK2xpc3QAAwADCLMBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tEZXZFeHByZXNzLlh0cmFHcmlkLkNvbHVtbnMuR3JpZENvbHVtblNvcnRJbmZvLCBEZXZFeHByZXNzLlh0cmFHcmlkLnYxMS4xLCBWZXJzaW9uPTExLjEuMTEuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iODhkMTc1NGQ3MDBlNDlhXV0IHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAAAQAAAAkDAAAAAAAAAAkEAAAABAMAAACzAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbRGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mbywgRGV2RXhwcmVzcy5YdHJhR3JpZC52MTEuMSwgVmVyc2lvbj0xMS4xLjExLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAwRGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mb1tdAgAAAAgICQUAAAABAAAAAQAAAAQEAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QDAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgUAAAgICQYAAAACAAAABwAAAAcFAAAAAAEAAAAEAAAABC5EZXZFeHByZXNzLlh0cmFHcmlkLkNvbHVtbnMuR3JpZENvbHVtblNvcnRJbmZvAgAAAAkHAAAADQMQBgAAAAQAAAAJCAAAAAkJAAAADQIMCgAAABlEZXZFeHByZXNzLlh0cmFHcmlkLnYxMS4xBQcAAAAuRGV2RXhwcmVzcy5YdHJhR3JpZC5Db2x1bW5zLkdyaWRDb2x1bW5Tb3J0SW5mbwIAAAAJU29ydE9yZGVyCkNvbHVtbk5hbWUAAQgKAAAAAQAAAAYLAAAAC0dyaWRDb2x1bW44AQgAAAAHAAAAAQAAAAYMAAAAC0dyaWRDb2x1bW4zAQkAAAAHAAAAAQAAAAkLAAAACw==</property>

  <property name="GroupSummarySortInfoState" />

</XtraSerializer>

:
Posted by 하늘바램
2012. 8. 22. 10:00

XtraGrid - Export Excel File Open Study/DevExpress2012. 8. 22. 10:00

XtraGrid에서 Excel로 Export하는 경우 Export 직후에 바로 파일을 오픈함으로써 탐색기를 통해서 파일을 열어야 하는 수고를 덜 수 있습니다.
그 방법에 대해서 알아보도록 하겠습니다.

 우선 기존에 파일을 Export했던 방식은 다음과 같습니다.

.
.
.

Dim View As DevExpress.XtraGrid.Views.Grid.GridView = CType(WG1.MainView,DevExpress.XtraGrid.Views.Grid.GridView)

If Not View Is Nothing Then

If dlgSaveExcel.ShowDialog() = DialogResult.OK Then

View.OptionsPrint.ExpandAllDetails = True

View.ExportToXls(dlgSaveExcel.FileName)

MsgBox("Savecomplete.")

End If

End If

.
.
.

우선 GridView 변수를 하나 선언해서 Export하고자 하는 그리드를 변수로 받아옵니다.
그리고 화면에 선언된 저장 대화상자를 통해서 저장경로와 파일명을 선택하고 저장을 눌러주면 ExportToXls 함수에 의해서 Export가 실행되고 완료후에 "Save complete"라는 메시지를 보여줍니다(위의 예는 GridView에 대한 Export 예 입니다).

View.OptionsPrint.ExpandAllDetails = True  

이 옵션은 Master-Detail 구조인 경우 모든 Detail 부분을 펼쳐서 Export한다는 뜻입니다.

이 방법은 Excel Export에는 문제가 없으나 Export가 완료된 후에 파일을 확인하려면 탐색기를 열어서 해당 파일을 찾아서 열거나 엑셀을 실행시켜서 따로 파일을 열어서 봐야 한다는 번거로움이 있습니다.

이제 변환된 방법을 보도록 하겠습니다.
BandedGridView를 가지고 예를 들어보도록 하겠습니다.

.
.
.

Dim View As DevExpress.XtraGrid.Views.BandedGrid.AdvBandedGridView = CType(WG1.MainView, DevExpress.XtraGrid.Views.BandedGrid.AdvBandedGridView)

 

If Not View Is Nothing Then

    If dlgSaveExcel.ShowDialog() = DialogResult.OK Then

Dim currentCursor As Cursor = Cursor.Current

Cursor.Current = Cursors.WaitCursor

 

View.OptionsPrint.ExpandAllDetails = True

View.OptionsPrint.PrintBandHeader = False

View.ExportToXls(dlgSaveExcel.FileName)

'File Open

If MessageBox.Show("Do you want open this file?", "Open", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then

            Dim process As System.Diagnostics.Process = New System.Diagnostics.Process()

            process.StartInfo.FileName = dlgSaveExcel.FileName

            process.StartInfo.Verb = "Open"

            process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal

            process.Start()

End If

 

Cursor.Current = currentCursor

    End If

End If

.
.

몇가지 변화가 있습니다.
우선 Export를 하기 전에 마우스 커서를 변경하고 Export 완료후에 마우스커서를 원래대로 되돌리는 코딩이 있습니다.
그리고 BandedGridView를 사용하면서 추가된 옵션이 있습니다.

View.OptionsPrint.PrintBandHeader =
 False 

이 부분인데 PrintBandHeader 옵션은 밴드명을 출력할지 여부를 결정합니다.
BandedPrintOption에 관해서는 다음 링크를 참고하시면 됩니다.

http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridViewsBandedGridBandedGridOptionsPrintMembersTopicAll

그리고 강조된 IF문 블럭이 파일을 Open하는 부분입니다.

MessageBox.Show("Do you want open this file?", "Open", MessageBoxButtons.YesNo)

이 구문으로 아래와 같은 창이 뜹니다.



 
기에서 '예'를 선택하면 파일을 바로 오픈해서 볼 수 있습니다. 

Porcess 클래스는 Local System의 Process를 시작하고 중지할 수 있는 클래스 입니다.

process.StartInfo 속성은 프로세스 시작시에 전달할 속성들을 설정합니다.
위에서는 파일명과, Verb(동작), WindowStyle을 설정했습니다.
그리고 프로세스를 시작하면 해당파일을 여는 동작을 수행합니다.
당연히 Excel이 설치되어 있어야 하고 xls 파일의 연결 프로그램이 Excel로 되어있어야 Excel로 파일을 열 수 있습니다.

Process 클래스에 대한 정보는

http://msdn.microsoft.com/ko-kr/library/system.diagnostics.process.aspx#Y0

여기에서 확인하실 수 있습니다.

Process.StartInfo 속성에 대한 정보는

http://msdn.microsoft.com/ko-kr/library/system.diagnostics.process.startinfo.aspx  

여기에서 확인하실 수 있습니다.

여기까지 Export File Open에 대해서 살펴보았습니다. 

:
Posted by 하늘바램
2012. 7. 31. 09:23

XtraGrid - Find Panel Study/DevExpress2012. 7. 31. 09:23

참고 사이트

http://documentation.devexpress.com/#WindowsForms/CustomDocument8869

 

그리드에서 간단하게 사용할 수 있는 Find Panel 기능에 대한 간단한 소개입니다.

XtraGrid는 엑셀처럼 각 컬럼의 헤더에서 적용할 수 있는 Filter 기능외에 Find Panel을 이용한 전체 필터링 기능을 제공합니다.

별다른 코드 없이 간단한 설정만으로 가능합니다.

Search, Find 등 간단한 조회화면에서 유용하게 사용할 수 있으리라고 기대됩니다.

위의 화면에서 빨강색으로 표시된 부분이 Find Panel입니다.
입력란에 찾고자 하는 문자열을 입력하면 그리드내에서 해당 문자열을 가진 Row Filtering 할 수 있습니다.


간단한 예를 보겠습니다.

이 그림은 입력란에 ‘CN’을 입력해서 Filtering을 한 예입니다.


그리고 이렇게 입력한 문자열은 다시 재사용이 가능합니다.

입력란은 콤보박스로 되어 있어서 위의 그림과 같이 이전에 입력했던 히스토리를 볼 수 있습니다.

 

설정 방법에 대해 알아보겠습니다.

 

Grid Run Designer를 실행시켜서 해당 Grid View를 선택합니다.
Options에서 OptionsFind를 펼쳐서 세부 설정을 할 수 있습니다. 

AllowFindPanel : Find Panel 사용여부에 대한 설정입니다. True인 경우에 사용할 수 있습니다.

이 부분이 True로 되어 있다면 그리드를 선택하고 Ctrl+F를 누르면 FindPanel이 나타납니다. 입력란 왼쪽의 x 표시를 누르거나 Close 버튼으로 감출 수 있습니다.

AlwaysVisible : Find Panel을 항상 보여줍니다.

ClearFindOnClose : Find Panel을 닫을 때 검색 히스토리를 삭제합니다.

FindDelay : 문자를 입력할 때 마다 Filtering을 할 지연시간입니다. 시간이 짧을수록 바로바로 Filtering이 됩니다. 단위는 밀리세컨드입니다.

FindFilterColumns : Filtering을 할 컬럼을 설정합니다. ‘*’로 설정할 경우 전체 컬럼에 적용됩니다.

FindMode : 입력할 때마다 Filtering을 할 것인지, Find 버튼이나 엔터키로 Filtering을 할 것인지를 결정합니다. Default는 입력할 때마다 Filtering을 합니다.

HighlightFindResults : Filtering값을 강조해서 보여줍니다.

ShouCloseButton : 닫기 버튼을 보여줍니다.


참고 사이트를 보시면 알 수 있듯이 두 단어 이상을 조합해서 And, Or 검색도 가능하고 특정 단어가 들어가지 않은 단어만 Filtering 하는 것도 가능합니다.

 

참고 사이트

http://documentation.devexpress.com/#WindowsForms/CustomDocument8869

 

:
Posted by 하늘바램