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

 

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

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

 

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