티스토리 뷰

아래 글은 지극히 주관적인 생각으로 작성 (작성자 초보)

 

목적 : 서로 다른 datagrid에 있는 데이터들을 각 해당하는 버튼. click 시 csv파일에 출력할 생각

 

Checkbox.Ischecked = True  일때. observablecollection (Of T)가 grid에 바인딩

                            =False  일때는
Dictionary(Of TKey, TValue).ValueCollection

 

이 두 가지 조건에 따라 Datagrid.itemsSource에 바인딩해주었다.

(WPF라 datagridview가 없었다...)

 

observablecollection의 리스트 타입과 TValue의 타입은 모두 custom_type으로 같음.

 

1. 처음 삽질 -> 실패

 

Datagrid를 datatable로 만들어서 column header를 파일에 써주고 

 

row 안의 column으로 이중 for each를 사용하여 파일에 써주려고 했다.

(한 행당 여러 콜럼을 써주면서 이동하는 것)

 

초보자인 내 입장으로서  observable과 dictionary를 따로 datatable로 만들어주기 좀 까다롭고 귀찮았다...

 

일단 list로 만들고 다시 datatable로 만들어주려 했으나 잘 되지 않았다.

 


 

2. 두 번째 삽질 (버튼 이벤트는 총 3개)

 

observable과 dictionary를 각각 나누어 처리해줘야 하나 엄청난 고민하던 중 

 

그 둘의 비슷한 점을 발견하였다!!!!!!!!

 

 바로 ICollection 상속받았던 것이다.

 

함수 인자로 받을 때 편-안...

 

그 후 

저장 대화 상자로 저장할 때 파일 이름 정해주고 싶었다.

 

"구분 문자"로 나누어 처리하였다.

	Sub EXPORTCSV1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
	  ToCSV1(DataGrid1.itemssource,"구분문자")
	END Sub
    
      //여기서 observable, dictionary.ValueCollection 타입을 받아줄 수 있게됨
    Sub ToCSV1(list As ICollection, gridname As String) 
    
   			 Dim FilePath As String
            
            If gridname.contains("구분문자")
             FilePath =("TEST_" & DateTime.Now.ToString("yyyy-MM-dd HH-mm") & ".csv")

            Else If gridname.contains("구분문자2")
			
            //저장 파일 이름 
             FilePath = ("ANYTHING" & DateTime.Now.ToString("yyyy-MM-dd HH-mm") & ".csv")

            Else
             FilePath = ("ANYTHING2" & DateTime.Now.ToString("yyyy-MM-dd HH-mm") & ".csv")

            End If 

            Dim sfd As New Microsoft.Win32.SaveFileDialog() //파일 저장 대화상자
            
			//유효한 Win32 파일 이름만 사용 	
            sfd.ValidateNames = True

            sfd.Title = FilePath &" 저장"
            sfd.FileName = FilePath
            sfd.DefaultExt =  ".csv"
            sfd.Filter = "(*.csv)|*.csv" 


            If sfd.ShowDialog()
                Try
                //datgrid 내용 적기

                Dim sb As New StringBuilder()
                sb.AppendLine("이름,설명,값,평균")  //엑셀 1행 설정 (grid columns header설정)

            
                For Each  sgtlist As custom_type In list

                    sb.append(WriteCSV(sgtlist.Name) +",") //,로 구분 
                    sb.append(WriteCSV(sgtlist.Description) +",")
                    sb.AppendFormat("{0:F3}" ,sgtlist.Value)  //소수점 3자리까지
                    sb.append(",")
                    sb.AppendFormat("{0:F3}",sgtlist.AvgValue)
                    sb.AppendLine()

                Next 
                     File.WriteAllText(sfd.FileName, sb.ToString, Encoding.GetEncoding(949))//한글인코딩
                    MessageBox.Show("파일이 저장되었습니다.")
                Catch Ex As Exception
                    MessageBox.Show("파일을 저장할 수 없습니다." & vbNewLine & vbNewLine & Ex.Message)
                End Try
            End If

        End Sub

깨달은 점 

  • writeAllText는 새 파일을 만들고 대상 파일이 이미 있으면 덮어쓴다.
  • 엑셀에 써줄 값들 중에 한글이 포함되어있으면 인코딩 필수 ㅎㅎㅎ
  • stringbuilder.AppendFormat으로 값의 표준 서식을 지정할 수 있다. 
  • 필터 설명|필터 옵션|필터 설명|필터 옵션.... 옵션하나에 여러 구분자를 추가하고싶을경우 세미콜론을 넣는다.
  • 컨트롤 상속 확인해보기

 

 

 

오늘의 삽질 끝.

반응형

'개발 > VB.NET' 카테고리의 다른 글

.NET 매개변수 전달방식  (0) 2020.11.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함