DataTable에서 해당하는 값 찾기
내가 만든 DataTable에서 kind 컬럼에는 암과 임파선 두 가지 범주가 있다. 정상 범주 분류 시에 예외 처리를 주기 위해 DataTable에 kind가 암인 컬럼이 하나라도 있으면 저장할 수 없도록 오류 메세지를 띄워야 사용자가 실수했을 때도 잘못된 데이터의 저장을 막을 수 있다. 이 프로그램 만들면서 깨달은 점은...... 사용자의 요구사항을 들어주면 들어줄수록 사용자 친화적으로 개발을 하는 게 정말 중요하다는 생각이 들었고, 생각보다 사용자는 컴퓨터를 모른다는 것이었고, 사용자는 갓난아기라는 것을 머리에 박고 개발을 해야 한다는 것이었다. 이걸 몰라? 이걸 이렇게 한다고? 라고 생각하는 순간 나도 스트레스받고 사용자도 스트레스받는다. 나는 이 프로그램을 개발한 사람이니까 하던 대로 행동을 하..
2022.05.18
no image
C# winform 동적으로 탭 추가하기
HTML 삽입 미리보기할 수 없는 소스 폐암 데이터 라벨링 작업을 위한 툴을 개발 중인데, 정답 이미지 레이블링을 진행한 후 그 레이블링에 대한 정보를 여러 개를 입력해야 한다. 이런 식으로 한 라벨링 당 저장해야 하는 정보가 많다는 뜻이다. (동일한 데이터 구조로) 요청을 받은 부분은 임파선 라벨링을 할 때 임파선의 위치 (첫 번째 노란 박스) 와 임파선의 양성, 악성 구분 + 해당 임파선에 대한 스코어(두번째 노란 박스) 를 따로 저장할 수 있게 프로그램을 만들어 달라는 것이었다. C# winform으로 진행을 하고 있었고 저장된 라벨링 정보는 csv에 전부 넣고 있었는데 추가 요청이 들어와서 싹 다 갈아 엎어야 하는 상황이 왔다...... 어차피 암으로 판정되는 부위를 그리고 나면 서브 폼이 떠서 ..
2022.05.09
no image
npgsql timeoutException
Npgsql.NpgsqlException: 'Exception while reading from stream' TimeoutException: Timeout during reading attempt npgsql timeout during reading attempt DB connection 후 코드 인으로 쿼리를 때려 박고 DataAdapter 에 저장하고 DataSet에 넣어야 하는데 쿼리 돌리는 속도가 오래 걸려서인지 계속 timeout 예외가 떴다 처음에는 서버 문제인 줄 알아서 postgresql을 다시 연결해 준 다음에 실행하니 dataset에 문제없이 해당 데이터가 담겼었다. 그런데 분명히 같은 select 문이었음에도 불구하고 또 같은 에러가 뜨는 것이다........... 왜 됐다가 안 되..
2021.07.29

 

내가 만든 DataTable에서 kind 컬럼에는 암과 임파선 두 가지 범주가 있다. 

정상 범주 분류 시에 예외 처리를 주기 위해 DataTable에 kind가 암인 컬럼이 하나라도 있으면 저장할 수 없도록 오류 메세지를 띄워야 사용자가 실수했을 때도 잘못된 데이터의 저장을 막을 수 있다. 

 

이 프로그램 만들면서 깨달은 점은...... 사용자의 요구사항을 들어주면 들어줄수록 사용자 친화적으로 개발을 하는 게 정말 중요하다는 생각이 들었고, 생각보다 사용자는 컴퓨터를 모른다는 것이었고, 사용자는 갓난아기라는 것을 머리에 박고 개발을 해야 한다는 것이었다. 이걸 몰라? 이걸 이렇게 한다고? 라고 생각하는 순간 나도 스트레스받고 사용자도 스트레스받는다. 나는 이 프로그램을 개발한 사람이니까 하던 대로 행동을 하지만 이 프로그램을 처음 본 사람은 어떻게 사용하는지 어디로 튀는지 미지수다. 그러면서 오류도 발견하고 보완해야 할 사항도 보이는 거니까...... 그래서 모든 방면에 예외처리를 꼼꼼하게 하고, 매뉴얼도 적으면서 진행하고 있다. 이 프로그램이 잘 만든 건 아니라는 건 나도 알다마는 그래도 기본은 해야 하니까. 원래 이거 회고에 적으려고 했는데 까먹을 것 같아서 생각나는 김에 적는다. 이만 각설하고 

 

 

DataTable chkInfo = info.readDT();
string kind = "암";

bool contains = chkInfo.AsEnumerable().Any(row => kind == row.Field<String>("Kind"));

 

간단하다. 체크해야 할 DataTable이 나는 다른 클래스에 있어서 원본 DataTable을 변수에 담아 주고 Linq를 이용해서 Kind 컬럼의 행을 모두 스캔한다. 

저 방법 말고 select 라는 함수를 사용하는 것도 있는데 select 함수를 사용하면 성능도 좀 느리고 컴파일할 때 문자열로 인식하기 때문에 별로 사용하지는 않고 있다. 그리고 코드도 별로 안 예쁜 것 같고...... 

AsEnumerable 메서드는 Linq 쿼리로 동작한다. C#에서 좋은 점은 Linq가 지원된다는 것인데 얘는 직접 쿼리로 만들어서 읽어서 하나하나 처리하는 게 아니라 내부 동작으로 빠르게 처리한다. 

데이터의 양이 많을 때는 무조건 Linq 함수로 개발하는 것이 좋다.

'Develop > C#' 카테고리의 다른 글

C# winform 동적으로 탭 추가하기  (0) 2022.05.09
npgsql timeoutException  (1) 2021.07.29

폐암 데이터 라벨링 작업을 위한 툴을 개발 중인데, 정답 이미지 레이블링을 진행한 후 그 레이블링에 대한 정보를 여러 개를 입력해야 한다. 

 

이런 식으로 한 라벨링 당 저장해야 하는 정보가 많다는 뜻이다. (동일한 데이터 구조로) 

요청을 받은 부분은 임파선 라벨링을 할 때 임파선의 위치 (첫 번째 노란 박스) 와 임파선의 양성, 악성 구분 + 해당 임파선에 대한 스코어(두번째 노란 박스) 를 따로 저장할 수 있게 프로그램을 만들어 달라는 것이었다. 

 

C# winform으로 진행을 하고 있었고 저장된 라벨링 정보는 csv에 전부 넣고 있었는데 추가 요청이 들어와서 싹 다 갈아 엎어야 하는 상황이 왔다...... 

 

어차피 암으로 판정되는 부위를 그리고 나면 서브 폼이 떠서 그 라벨링에 대한 정보를 저장해 놓을 수 있게 했기 때문에 서브폼에 탭을 동적으로 만들어 추가를 해야 하면 추가하는 식으로 개발하기로 했다. 

너무 애매했던 게 저렇게 라벨링 부위를 노란색으로 색칠을 해도 저 부위가 위치가 3R일 수도 있고 4R일 수도 있고, 위치가 5일 수도 있고 6일 수도 있다는 거다. 그러니까 정확한 위치 판별이 되지 않는다는 뜻이다. 그리고 추가하는 데이터가 최대 몇 개까지 나올 수 있는지도 정확하지 않다. 정확하지 않은 데이터를 정형적으로 만들려고 하니 하...... 하지만 개발로는 안 되는 게 없다. 다시 정신 잡고 프로그램 프로세스를 생각해 보자 ㅋㅋ 

 

결국 탭을 만들어 추가 버튼을 누르면 무한으로 만들 수 있게 구축했다. 

스택오버플로나 다른 블로그 검색해도 for문으로 탭 여러개 만들기 이런 것밖에 안 뜨던데 어디서 하나 찾아서 코딩했던 것 같다...... 

탭 안의 폼 내용은 사용자 컨트롤을 만들어 넣었다. 

 

 

탭 추가를 하면 동적으로 탭이 생성된다. 

    // 탭 추가 버튼 이벤트
    private void btnAddTab_Click(object sender, EventArgs e)
    {
    	// 추가할 TabPage 선언
        TabPage nodeTab = null;
        
        // TabPage 안에 들어갈 내용 
        // 사용자 컨트롤을 만들어서 넣었기 때문에 사용자 컨트롤도 선언해 준다 
        AddNodeControl nodeControl = new AddNodeControl();
		
        
        // TabPage 위에 텍스트를 추가해 주고 싶으면 new TabPage("text"); 로 작성해도 됨
        nodeTab = new TabPage(); 
        // TabPage 안에 사용자 컨트롤 넣기 
        nodeTab.Controls.Add(nodeControl);
        // 나는 탭 제목들을 추가할 때마다 1 2 3 4 5 로 만들어 주기 위해서 이렇게 했다
        nodeTab.Text = (tabNode.SelectedIndex + 2).ToString();
        nodeTab.UseVisualStyleBackColor = true;
        // 전체 탭컨트롤의 이름이 tabNode임. 
        // tabNode에 탭 페이지를 추가할 것이다 <- nodeTab을
        tabNode.TabPages.Add(nodeTab);
		
        // 이 부분을 작성하지 않으면 추가한 탭 페이지로 포커스 되지 않고 첫 번째 탭으로 포커스가 됨. 
        // 추가한 페이지로 포커스 하고 싶으면 이 구문 쓰면 된다 
        tabNode.SelectedTab = nodeTab;
    }

 

탭 제거 버튼

private void btnRemoveTab_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show(string.Format("{0}번 탭을 삭제하시겠습니까?"
            	, (tabNode.SelectedIndex + 1).ToString()), "삭제"
                , MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
            	// 탭 삭제
                tabNode.TabPages.Remove(tabNode.SelectedTab);
            }
            else
            {
                return;
            }
        }

 

winform에서 버튼 클릭으로 탭 추가하는 방법에 대해서 알아 보았다. 

'Develop > C#' 카테고리의 다른 글

DataTable에서 해당하는 값 찾기  (0) 2022.05.18
npgsql timeoutException  (1) 2021.07.29

Npgsql.NpgsqlException: 'Exception while reading from stream'

TimeoutException: Timeout during reading attempt

npgsql timeout during reading attempt

 

 

DB connection 후 

코드 인으로 쿼리를 때려 박고 DataAdapter 에 저장하고 DataSet에 넣어야 하는데 쿼리 돌리는 속도가 오래 걸려서인지 계속 timeout 예외가 떴다 

 

처음에는 서버 문제인 줄 알아서 postgresql을 다시 연결해 준 다음에 실행하니 dataset에 문제없이 해당 데이터가 담겼었다. 그런데 분명히 같은 select 문이었음에도 불구하고 또 같은 에러가 뜨는 것이다........... 왜 됐다가 안 되는지는 잘 모르겠지만 아마 메모리 누수 때문일 수도 있고 리소스 많이 잡아 먹어서 그럴 수도 있다. 

 아무튼 서버 문제도 아니니 해결 방법은 시간을 늘려주는 것이니 connection 부분에서 시간을 늘려 주었다. 

 

Timeout, CommandTimeout 을 각각 넣어주면 정상적으로 실행이 된다 

 

짜면서도 너무 비효율적이라 짜증나는데 개선 방법에 대해서 좀 생각해 봐야겠다......

 

'Develop > C#' 카테고리의 다른 글

DataTable에서 해당하는 값 찾기  (0) 2022.05.18
C# winform 동적으로 탭 추가하기  (0) 2022.05.09