티스토리 뷰
아래 글은 지극히 주관적인 생각으로 작성 (작성자 초보)
목적 : 서로 다른 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
- 라우터
- 알고리즘
- 삽질
- aws
- 자바
- 프로그래머스
- 스위치
- 회고록
- 3Way Handshake
- dto
- Spring Boot
- osi7계층
- 계층
- 개발자
- 라우팅
- lambda
- spring
- 네트워크
- 초보
- SpringBoot
- java
- 프로토콜
- Docker
- rds
- .NET
- ec2
- 개발
- 회고
- tcp
- s3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |